【IOS】無縫橋接

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                   (不改變對象所有權)
  • __bridge_retained 或者 CFBridgingRetain()               (解除 ARC 所有權)

  • __bridge_transfer 或者 CFBridgingRelease()            

    給予 ARC 所有權)
__bridge_retained 或者 CFBridgingRetain()  將Objective-C對象轉換爲Core Foundation對象,把對象所有權橋接給Core Foundation對象,同時剝奪ARC的管理權,後續需要開發者使用CFRelease或者相關方法手動來釋放對象。CFBridgingRetain()  是 __bridge_retained 的宏方法。
__bridge_transfer 或者 CFBridgingRelease()  將非Objective-C對象轉換爲Objective-C對象,同時將對象的管理權交給ARC,開發者無需手動管理內存。
__bridge 只做類型轉換,不改變對象所有權,是我們最常用的轉換符。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章