Core Foundation对象的垃圾收集

0xc*_*ced 4 cocoa garbage-collection static-analysis

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

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

产生以下警告:

调用函数'CFPreferencesCopyAppValue'返回一个Core Foundation对象,其中包含+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];
}
Run Code Online (Sandbox Code Playgroud)

或者这只是假阳性,因为复制的对象是免费桥接的?

kpe*_*yua 8

试试这个:

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

没有CFMakeCollectable,这将在GC中泄漏,因为a CFRetain与ObjC不同-retain.A CFRetain禁用该对象的垃圾收集,并需要CFMakeCollectable启用它.

  • 而不是强制转换CFMakeCollectable(),使用NSMakeCollectable().但除此之外,kperryua的答案是正确的.另见:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html (4认同)