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

时间:2015-05-13 18:03:24

标签: 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);
}

1 个答案:

答案 0 :(得分:5)

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

对应就是为什么在ARC中CoreFoundation对象可以__bridge_transfer到ARC。

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

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

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