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 有两个宏 CFBridgingRetainCFBridgingRelease 可以直接用,要注意 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工程转换和开发注意事项

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。