Objective-C 和 Core Foundation 物件相互轉換的記憶體管理總結
Objective-C 和 Core Foundation 物件相互轉換的記憶體管理總結
iOS允許Objective-C 和 Core Foundation 物件之間可以輕鬆的轉換,拿 NSString 和 CFStringRef 來說,直接轉換豪無壓力:
針對記憶體管理問題,ARC 可以幫忙管理 Objective-C 物件, 但是不支援 Core Foundation 物件的管理,所以轉換後要注意一個問題:誰來釋放使用後的物件。 本文重點總結一下型別轉換後的記憶體管理。
一、非ARC的記憶體管理
倘若不使用ARC,手動管理記憶體,思路比較清晰,使用完,release轉換後的物件即可。
二、ARC下的記憶體管理
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 所有權)
1. __bridge_retained 或者 CFBridgingRetain()
__bridge_retained 或者 CFBridgingRetain() 將Objective-C物件轉換為Core Foundation物件,把物件所有權橋接給Core Foundation物件,同時剝奪ARC的管理權,後續需要開發者使用CFRelease或者相關方法手動來釋放物件。
來看個例子:
CFBridgingRetain() 是 __bridge_retained 的巨集方法,下面兩行程式碼等價:
2. __bridge_transfer 或者 CFBridgingRelease()
__bridge_transfer 或者 CFBridgingRelease() 將非Objective-C物件轉換為Objective-C物件,同時將物件的管理權交給ARC,開發者無需手動管理記憶體。
接著上面那個記憶體洩漏的例子,再轉成OC物件交給ARC來管理記憶體,無需手動管理,也不會出現記憶體洩漏:
CFBridgingRelease() 是__bridge_transfer的巨集方法,下面兩行程式碼等價:
從OC轉CF,ARC管理記憶體:
從CF轉OC,需要開發者手動釋放,不歸ARC管:
相關文章
- Objective-C記憶體管理:物件Object記憶體物件
- iOS引用轉換:Foundation與Core Foundation對iOS
- iOS引用轉換:Foundation與Core Foundation物件互相轉換(__CFString轉NSString,void *轉id等等)iOS物件
- 記憶體_管理總結記憶體
- Objective-C記憶體管理Object記憶體
- Objective-C 記憶體管理Object記憶體
- Objective-C記憶體管理:BlockObject記憶體BloC
- 記憶體偏移(RVA)與檔案偏移(offset)相互轉換記憶體
- JVM記憶體管理——總結篇JVM記憶體
- Objective-C記憶體管理教程和原理剖析(一)Object記憶體
- Objective-C記憶體管理教程和原理剖析(二)Object記憶體
- Objective-C記憶體管理教程和原理剖析(三)Object記憶體
- Objective-C記憶體管理教程和原理剖析(四)Object記憶體
- DOM物件與jquery物件的相互轉換物件jQuery
- jQuery物件與Dom物件的相互轉換jQuery物件
- Objective-C中的記憶體管理機制Object記憶體
- dom物件和jQuery物件相互轉換簡單介紹物件jQuery
- PostgreSQL中將物件oid和物件名相互轉換SQL物件
- C#--得到物件在記憶體中的大小和把記憶體中的位元組轉換為字串C#物件記憶體字串
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- iphone 記憶體管理的一些總結iPhone記憶體
- 開發:隨筆記錄之 Json字串和物件的相互轉換筆記JSON字串物件
- 一些轉儲和清除記憶體物件和物理物件的命令(轉)記憶體物件
- java 物件與xml相互轉換Java物件XML
- Linux記憶體管理複習總結Linux記憶體
- linux記憶體管理學習總結Linux記憶體
- jQuery 物件 與 原生 DOM 物件 相互轉換jQuery物件
- 淺談JVM記憶體結構 和 Java記憶體模型 和 Java物件模型JVM記憶體Java模型物件
- java物件與json物件間的相互轉換Java物件JSON
- 《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之記憶體託管物件與非託管物件Swift筆記框架記憶體物件
- json字串和js物件之間相互轉換JSON字串物件
- Objective-C 記憶體管理之ARC規則Object記憶體
- 常見物件-StringBuffer和String的相互轉換物件
- 一些轉儲和清除記憶體物件和物理物件的命令記憶體物件
- oracle 記憶體分配和調優 總結Oracle記憶體
- iOS開發系列—Objective-C之記憶體管理iOSObject記憶體
- JAVA記憶體管理 [轉]Java記憶體
- RVA和RAW相互轉換