首页 > 代码库 > iOS 8:【转】CoreFoundation 和 NSObject 在 ARC 下的转换
iOS 8:【转】CoreFoundation 和 NSObject 在 ARC 下的转换
源地址:http://fann.im/blog/2013/12/25/corefoundation-bridge-nsobject/
CoreFoundation 有自己的引用计数处理方法,在 CF 下如果生成对象的方法中有 create、retain、copy 就表示 CF 会用自己的方式对引用计数加一,这就需要在结束的时候用 CFRelease()
释放。而 ARC 目前只对 NSObject 对象有自动的引用计数处理,所以在 ARC 如果有 CoreFoundation 对象和 NSObject 对象转换就需要用 __bridge
, __bridge_transfer
, __bridge_retained
进行引用计数管理的转换。
__bridge
表示 CF 对象和 NSObject 的引用计数平衡,无需转换管理权。适用于用不包含 create、retain、copy 的方法获取的 CF 对象转换为 NSObject。__bridge_transfer
表示将 CF 对象的引用计数管理员转移到 NSObject 由 ARC 管理,无需再用CFRelease()
释放。__bridge_retained
表示将 NSObject 对象的引用计数管理权转移到 CF 管理,并且引用计数加一,那么在 CF 层就需要用CFRelease()
释放该对象。
SDK 有两个宏 CFBridgingRetain
, CFBridgingRelease
可以直接用,要注意 CFBridgingRetain
后要用 CFRelease()
释放。
// After using a CFBridgingRetain on an NSObject, the caller must take responsibility for calling CFRelease at an appropriate time.NS_INLINE CF_RETURNS_RETAINED CFTypeRef CFBridgingRetain(id X) { return (__bridge_retained CFTypeRef)X;}NS_INLINE id CFBridgingRelease(CFTypeRef CF_CONSUMED X) { return (__bridge_transfer id)X;}
参考 ARC工程转换和开发注意事项
iOS 8:【转】CoreFoundation 和 NSObject 在 ARC 下的转换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。