在这段代码上运行静态分析器:
- (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];
}
或者这只是假阳性,因为复制的对象是免费桥接的?
答案 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
才能启用它。