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)
或者这只是假阳性,因为复制的对象是免费桥接的?
试试这个:
- (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启用它.