4

在这段代码上运行静态分析器:

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 return [(id)matchStyle autorelease];
}

产生以下警告:

调用函数“CFPreferencesCopyAppValue”返回一个核心基础对象,其保留计数为 +1(拥有引用)。Core Foundation 对象不会自动进行垃圾回收。

这是一个警告,我应该用这样丑陋的东西来修复:

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 id nsMatchStyle = [(id)matchStyle copy];
 if (matchStyle) {
  CFRelease(matchStyle);
 }
 return [nsMatchStyle autorelease];
}

或者这只是一个误报,因为复制的对象是免费桥接的?

4

1 回答 1

8

试试这个:

- (id) readForeignPref
{
      CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
      return [(id)CFMakeCollectable(matchStyle) autorelease];
}

如果没有CFMakeCollectable,这将在 GC 中泄漏,因为 aCFRetain与 ObjC 不同-retain。ACFRetain禁用该对象的垃圾收集,并且需要CFMakeCollectable启用它。

于 2009-09-03T14:15:56.280 回答