Cocoa 核心基础对象的垃圾收集
在这段代码上运行静态分析器:Cocoa 核心基础对象的垃圾收集,cocoa,garbage-collection,static-analysis,Cocoa,Garbage Collection,Static Analysis,在这段代码上运行静态分析器: - (id) readForeignPref { CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); return [(id)matchStyle autorelease]; } 产生以下警告: 调用函数“CFAdvestEnsCopyAppValue'返回一个具有+1保留计数(拥有引用)的
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)matchStyle autorelease];
}
产生以下警告:
调用函数“CFAdvestEnsCopyAppValue'返回一个具有+1保留计数(拥有引用)的核心基础对象。核心基础对象不是自动垃圾收集的。 这是一个警告,我应该用这样丑陋的东西来修正:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
id nsMatchStyle = [(id)matchStyle copy];
if (matchStyle) {
CFRelease(matchStyle);
}
return [nsMatchStyle autorelease];
}
或者这只是一个误报,因为复制的对象是免费桥接的?尝试以下方法:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)CFMakeCollectable(matchStyle) autorelease];
}
如果没有
CFMakeCollectable
,这将在GC中泄漏,因为CFRetain
不同于ObjC-retain
。CFRetain
禁用该对象的垃圾收集,需要CFMakeCollectable
来启用它。使用NSMakeCollectable()代替强制转换CFMakeCollectable()。但除此之外,kperryua的答案是正确的。另请参见:CFMakeCollectable只是CFRelease的CF对象。由于对象是从GC区域分配的,收集器将始终管理保留计数为0的CF对象。(实施细节,但……你有了)