在这段代码上运行静态分析器:
- (id) readForeignPref { CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); return [(id)matchStyle autorelease]; }
产生以下警告:
对函数“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 . 一 克弗兰 禁用该对象的垃圾回收,并需要 cfmakeCollectable可收集 使能。
CFMakeCollectable
CFRetain
-retain
克弗兰
cfmakeCollectable可收集