你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 《從零開始學Swift》學習筆記(Day 61)——Core Foundation框架之內存管理

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

編輯:IOS開發綜合

  在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對象就內存就可以釋放了。

  

wKioL1beORLRnZJIAAdMPFPEu3Q495.jpg

 

  來總結一下:

  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中程序就會發生運行期錯誤。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved