Core Foundation对象的垃圾收集

时间:2009-09-03 12:54:52

标签: cocoa garbage-collection static-analysis

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

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

产生以下警告:

  

调用函数'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];
}

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

1 个答案:

答案 0 :(得分:8)

试试这个:

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

如果没有CFMakeCollectable,这会在GC中泄漏,因为CFRetain与ObjC -retain不同。 CFRetain禁用该对象的垃圾收集,需要CFMakeCollectable才能启用它。