4

当运行针对代码锵静态分析器,我已经转换为使用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桥的确切行动,所以我试图解出以上。实际分析仪输出如下:

Visual depiction of static analyzer results

我读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); 

静态分析这给了卫生清洁提单。

我误解了对象是免费桥接的方式,或者这是静态分析器中的错误?

+0

这是Xcode 4.2中的一个分析器错误,正如Joshua在下面指出的那样,它似乎已经用Xcode 4.3的分析器版本解决了。 –

回答

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在10.7上的最新4.2版本。

+0

Xcode 4.2,build 4D199。我已经使用显示此代码块的静态分析器结果的图像更新了问题。对于踢腿,我尝试在明确的'@ autoreleasepool'中包装我的上面的代码,看看是否有所作为,但它没有。 –

+0

根据新信息编辑我的答案。看起来这只是分析仪不适合与ARC玩,我建议抓住最新的分析仪构建。它很容易放入并替换Xcode中的一个。 http://clang-analyzer.llvm.org/xcode.html –

+0

我刚刚对尝试使用示例进行评论,并以相同的方式失败。如果他们已经在Clang项目中解决了这个问题,你认为提交bug报告有什么意义? –