《從零開始學Swift》學習筆記(Day 61)——Core Foundation框架以內存管理

原創文章,歡迎轉載。轉載請註明:關東昇的博客  php

Swift原生數據類型、Foundation框架數據類型和Core Foundation框架數據類型之間轉換過程當中,雖然是大部分是能夠零開銷橋接,零開銷並不意味着內存什麼都不用管。Swift類型內存管理是採用ARCFoundation類型和Core Foundation類型內存管理都是採用MRCARCCore Foundation類型內存管理是基於C語言風格的,它有一個對象全部權的概念。 微信

Objective-CMRC內存管理框架

Core Foundation的內存管理與Objective-CMRC內存管理密不可分,先介紹一下Objective-CMRC內存管理。網站

全部Objective-C類都繼承NSObject類,每一個NSObject對象都有一個內部計數器,這個計數器跟蹤對象的引用次數,被稱爲「引用計數Reference Count,簡稱RC)。當對象被建立時候,引用計數爲1。爲了保證對象的存在,能夠調用retain方法保持對象,retain方法會使其引用計數加1,若是不須要這個對象能夠調用releaseautorelease方法,releaseautorelease方法使其引用計數減1。當對象的引用計數爲0的時候,系統運行環境纔會釋放對象內存。spa

引用計數示例如圖所示,首先在第①步調用者A中建立了一個NSObject對象,這時該對象引用計數爲1。在第②步調用者B中想使用這個NSObject對象,因而使用NSObject對象引用,可是爲了防止使用過程當中NSObject對象被釋放,能夠調用retain方法使引用計數加1,這時引用計數爲2。在第③步調用者A中調用releaseautorelease方法,使引用計數減1,這時引用計數爲1。在第④步調用者C中調用releaseautorelease方法,只是得到NSObject對象引用,並無調用retainreleaseautorelease方法,所以沒有引發引用計數的變化。在第⑤步調用者B中調用releaseautorelease方法使引用計數減1,這時引用計數爲0。這個時候NSObject對象就內存就能夠釋放了。.net

 

來總結一下:設計

1. 誰建立或拷貝對象,他也必定要負責調用NSObject對象releaseautorelease方法,使引用計數減1,如圖中調用者A在第①步,負責建立了NSObject對象,那麼調用者A也必須是負責使引用計數減1,見第④步。對象

2. 誰調用retain方法使引用計數加1,它也必定要負責調用NSObject對象releaseautorelease方法,使引用計數減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_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
 

更多精品iOSCocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php

相關文章
相關標籤/搜索