为什么静态分析仪显示这个桥接的NSNumber在ARC下泄漏?

Bra*_*son 4 xcode cocoa objective-c clang-static-analyzer automatic-ref-counting

当针对我转换为使用ARC的代码运行Clang Static Analyzer时,它报告此代码块中的NSNumber是泄漏:

NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);

CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);
Run Code Online (Sandbox Code Playgroud)

分析器指示创建并存储到temporaryNumber中的NSNumber在所有这些之后以+1保留计数结束,因此泄漏.我知道我可以轻松做到

CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, (__bridge CFNumberRef)[NSNumber numberWithFloat:0.85]);
Run Code Online (Sandbox Code Playgroud)

但是我仍然试图理解在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);
Run Code Online (Sandbox Code Playgroud)

静态分析仪给这个健康的清单.

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

Jos*_*erg 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作,不提供分析器警告.这是使用iOS SDK的最新4.2 on 10.7.