Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 核心基础对象的垃圾收集_Cocoa_Garbage Collection_Static Analysis - Fatal编程技术网

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对象。(实施细节,但……你有了)