如果我有一个非免费桥接 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);
}
答案 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中具有完全等价物的对象,因此它们可以互换使用。