您好,登錄后才能下訂單哦!
原創文章,歡迎轉載。轉載請注明:關東升的博客
在Swift原生數據類型、Foundation框架數據類型和Core Foundation框架數據類型之間轉換過程中,雖然是大部分是可以零開銷橋接,零開銷并不意味著內存什么都不用管。Swift類型內存管理是采用ARC,Foundation類型和Core Foundation類型內存管理都是采用MRC或ARC,CoreFoundation類型內存管理是基于C語言風格的,它有一個對象所有權的概念
Objective-C的MRC內存管理
Core Foundation的內存管理與Objective-C的MRC內存管理密不可分,先介紹一下Objective-C的MRC內存管理。
所有Objective-C類都繼承NSObject類,每個NSObject對象都有一個內部計數器,這個計數器跟蹤對象的引用次數,被稱為“引用計數”(Reference Count,簡稱RC)。當對象被創建時候,引用計數為1。為了保證對象的存在,可以調用retain方法保持對象,retain方法會使其引用計數加1,如果不需要這個對象可以調用release或autorelease方法,release或autorelease方法使其引用計數減1。當對象的引用計數為0的時候,系統運行環境才會釋放對象內存。
引用計數示例如圖所示,首先在第①步調用者A中創建了一個NSObject對象,這時該對象引用計數為1。在第②步調用者B中想使用這個NSObject對象,于是使用NSObject對象引用,但是為了防止使用過程中NSObject對象被釋放,可以調用retain方法使引用計數加1,這時引用計數為2。在第③步調用者A中調用release或autorelease方法,使引用計數減1,這時引用計數為1。在第④步調用者C中調用release或autorelease方法,只是獲得NSObject對象引用,并沒有調用retain、release或autorelease方法,因此沒有引起引用計數的變化。在第⑤步調用者B中調用release或autorelease方法使引用計數減1,這時引用計數為0。這個時候NSObject對象就內存就可以釋放了。
來總結一下:
1. 誰創建或拷貝對象,他也一定要負責調用NSObject對象release或autorelease方法,使引用計數減1,如圖中調用者A在第①步,負責創建了NSObject對象,那么調用者A也必須是負責使引用計數減1,見第④步。
2. 誰調用retain方法使引用計數加1,它也一定要負責調用NSObject對象release或autorelease方法,使引用計數減1,如圖中調用者B在第②步,調用者B調用NSObject對象retain方法使引用計數加1,那么調用者B也必須是負責使引用計數減1,見第⑤步。
對象所有權
一個對象可以有一個或多個所有者,從所有者的角度看是對這個對象具有了“所有權”,從上圖中看,調用者A和調用者B是所有者,他們可能是一段程序,可能是一個對象。他們對NSObject對象具有所有權,不再使用時候他們應該負責放棄對象所有權,當對象沒有所有者時,引用計數為0,它才可以被釋放。
如上圖如果按照對象所有權解釋:調用者A創建或拷貝NSObject對象,這時調用者A就具有了NSObject對象的所有權,見第①步。調用者B調用NSObject對象retain方法,就獲得了也NSObject對象的所有權,見第②步。調用者A調用NSObject對象release方法,放棄NSObject對象的所有權,見第③步。調用者C只是使用NSObject對象沒有獲得NSObject對象的所有權,見第④步。調用者B調用NSObject對象release方法,放棄NSObject對象的所有權,見第⑤步,但是調用者B使用這個NSObject對象過程中,由于其他調用者放棄所有權,導致NSObject對象被釋放,那么調用者B中程序就會發生運行期錯誤。
歡迎關注關東升新浪微博@tony_關東升。
關注智捷課堂微信公共平臺,了解最新技術文章、圖書、教程信息
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。