当针对我转换为使用ARC的代码运行Clang Static Analyzer时,它报告此代码块中的NSNumber是泄漏:
NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);
分析器指示创建并存储到temporaryNumber中的NSNumber在所有这些之后以+1保留计数结束,因此泄漏。我知道我可以轻松做到
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, (__bridge CFNumberRef)[NSNumber numberWithFloat:0.85]);
但我仍然试图了解ARC中桥接的确切行为,所以我试图解开上述问题。实际的分析仪输出如下:
我阅读CFBridgingRetain()
和__bridge_retained
的方式是,他们通过将保留计数增加1来将ARC管理的NSObject的所有权转移到Core Foundation。我将其与相应的{{1}进行平衡}。我希望将NSNumber创建为自动释放的对象,因此在ARC端完全平衡。
同样,如果我使用普通的CFRelease()
演员来执行以下操作:
__bridge
静态分析仪为此提供了一个清洁的健康状况。
我是否误解了对象无人值守桥接的方式,或者这是静态分析器中的错误?
答案 0 :(得分:5)
修改强> 这是一个分析器错误。我的机器上有最新版本的独立分析仪,没有任何警告。我使用当前的运输分析器验证了结果并获得了与您相同的结果。看起来已经很好了。
您使用的是什么版本的Xcode?我刚刚测试了以下内容。
int main(int argc, char *argv[])
{
@autoreleasepool
{
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);
CFDictionarySetValue(dict, CFSTR("Test"), compressionQuality);
CFRelease(compressionQuality);
CFRelease(dict);
}
}
这可以按预期工作,并且不提供分析器警告。这是使用iOS SDK的最新4.2 on 10.7。