原創文章,歡迎轉載。轉載請註明:關東昇的博客 php
在Swift原生數據類型、Foundation框架數據類型和Core Foundation框架數據類型之間轉換過程當中,雖然是大部分是能夠零開銷橋接,零開銷並不意味着內存什麼都不用管。Swift類型內存管理是採用ARC,Foundation類型和Core Foundation類型內存管理都是採用MRC或ARC,Core Foundation類型內存管理是基於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的時候,系統運行環境纔會釋放對象內存。spa
引用計數示例如圖所示,首先在第①步調用者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對象就內存就能夠釋放了。.net
來總結一下:設計
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