ARC可以管理非免费桥接的Core Foundation对象吗?

Joh*_*nac 4 objective-c automatic-ref-counting

如果我有一个非免费桥接的 Core Foundation对象,我可以安全地将所有权转移到ARC,还是为免费桥接类型保留的权限?

例如:

- (id)myBundle {
    CFBundleRef b = CFBundleCreate(NULL, self.bundleURL);
    return b == NULL ? nil : (__bridge_transfer id)b;
}

- (UInt32)myBundleVersionNumber {
    return CFBundleGetVersionNumber((__bridge CFBundleRef)self.myBundle);
}
Run Code Online (Sandbox Code Playgroud)

CRD*_*CRD 6

每个CoreFoundation对象也是一个Objective-C对象.在过去,CFAutoRelease()在10.9中引入之前,非ARC代码将使用成语自动释放CoreFoundation对象[(id)<CFTypeRef> autorelease]; 由于CoreFoundation对象是Objective-C对象,这是可能的.

对应就是为什么在ARC中,CoreFoundation对象可以被__bridge_transfer赋予ARC.

所以答案是肯定的,您可以安全地将任何CoreFoundation对象的所有权转移给ARC.

如果您在汇编程序级别单步执行示例代码,您将发现ARC调用_objc_release,而这反过来将最终调用CFRelease.

注意:免费桥接对象是CoreFoundation和Objective-C中具有完全等价物的对象,因此它们可以互换使用.