当运行针对代码锵静态分析器,我已经转换为使用ARC,它报告的NSNumber在这个代码块是一个泄漏:为什么静态分析器显示这个桥接NSNumber在ARC下泄漏?
NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);
的分析表明,NSNumber的创建并存储成temporaryNumber最终以+1保留计数结束,从而泄漏。我知道,我可以很容易地做到
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, (__bridge CFNumberRef)[NSNumber numberWithFloat:0.85]);
,但我还是想知道,在ARC桥的确切行动,所以我试图解出以上。实际分析仪输出如下:
我读CFBridgingRetain()
和__bridge_retained
的方式是,它们由1增加保留计数我平衡这种转移的ARC管理NSObject的所有权,以核心基础相应的CFRelease()
。我希望NSNumber被创建为一个自动释放对象,因此在ARC方面是完全平衡的。
同样,如果我不使用纯__bridge
投如下:
NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = (__bridge CFNumberRef)temporaryNumber;
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);
静态分析这给了卫生清洁提单。
我误解了对象是免费桥接的方式,或者这是静态分析器中的错误?
这是Xcode 4.2中的一个分析器错误,正如Joshua在下面指出的那样,它似乎已经用Xcode 4.3的分析器版本解决了。 –