核心基础对象的垃圾收集
-
21-09-2019 - |
题
运行静态分析器上这一段代码:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)matchStyle autorelease];
}
产生以下警告:
呼叫FUNCTION“CFPreferencesCopyAppValue”返回一个核心基础对象与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
启用它。
不隶属于 StackOverflow