ARC 可以管理非免费桥接的 Core Foundation 对象吗?
Can ARC manage non-toll-free-bridged Core Foundation objects?
如果我有一个非免费桥接 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);
}
每个 CoreFoundation 对象 (CFTypeRef
) 也是一个 Objective-C 对象 (id
)。
在过去,在 10.9 中引入 CFAutorelease()
之前,非 ARC 代码将使用 [(id)<CFTypeRef> autorelease]
习惯用法自动释放 CoreFoundation 对象,这是可能的,因为 CoreFoundation 对象是 Objective-C对象。
对应的是为什么在 ARC 中 CoreFoundation 对象可以 __bridge_transfer
'ed 到 ARC。
所以答案是肯定的,您可以安全地将任何 CoreFoundation 对象的所有权转移给 ARC。
如果您在汇编程序级别单步执行示例代码,您会发现 ARC 调用 _objc_release
,而 ARC 最终会调用 CFRelease
.
注意: 免费桥接对象是那些在 CoreFoundation 和 Objective-C 中完全等效的对象,因此它们可以互换使用。
如果我有一个非免费桥接 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);
}
每个 CoreFoundation 对象 (CFTypeRef
) 也是一个 Objective-C 对象 (id
)。
在过去,在 10.9 中引入 CFAutorelease()
之前,非 ARC 代码将使用 [(id)<CFTypeRef> autorelease]
习惯用法自动释放 CoreFoundation 对象,这是可能的,因为 CoreFoundation 对象是 Objective-C对象。
对应的是为什么在 ARC 中 CoreFoundation 对象可以 __bridge_transfer
'ed 到 ARC。
所以答案是肯定的,您可以安全地将任何 CoreFoundation 对象的所有权转移给 ARC。
如果您在汇编程序级别单步执行示例代码,您会发现 ARC 调用 _objc_release
,而 ARC 最终会调用 CFRelease
.
注意: 免费桥接对象是那些在 CoreFoundation 和 Objective-C 中完全等效的对象,因此它们可以互换使用。