Foundation框架定義了各種collection對應的Object-C類,相似的是CoreFoundation同樣定義了一套C語言的API。NSArray與CFArray,這兩種創建數組的方式可能有差別,但是有種強大的功能可以在兩個類型之間平滑切換,這就是今兒要講到的無縫橋接 toll-free bridging
ARC的誕生大大簡化了我們針對內存管理的開發工作,但是隻支持管理 Objective-C 對象, 不支持 Core Foundation 對象。Core Foundation 對象必須使用CFRetain和CFRelease來進行內存管理。那麼當使用Objective-C 和 Core Foundation 對象相互轉換的時候,必須讓編譯器知道,到底由誰來負責釋放對象,是否交給ARC處理。只有正確的處理,才能避免內存泄漏和double
free導致程序崩潰。
根據不同需求,有3種轉換方式
__bridge_retained 或者 CFBridgingRetain() 將Objective-C對象轉換爲Core Foundation對象,把對象所有權橋接給Core Foundation對象,同時剝奪ARC的管理權,後續需要開發者使用CFRelease或者相關方法手動來釋放對象。CFBridgingRetain() 是 __bridge_retained
的宏方法。
__bridge_transfer 或者 CFBridgingRelease() 將非Objective-C對象轉換爲Objective-C對象,同時將對象的管理權交給ARC,開發者無需手動管理內存。
__bridge 只做類型轉換,不改變對象所有權,是我們最常用的轉換符。