Objective-C的內存管理

1、Objective-C內存管理的對象程序員

1. 值類型:好比int、float、struct等基本數據類型。算法

  • 值類型會被放入棧中,在內存中佔有一塊連續的內存空間,遵循先進後出的原則,故不會產生碎片。
  • 由系統分配管理

2. 引用類型:Objective-C的對象安全

  • 引用類型會被放到堆中,內存分配按照必定的分配算法,但不管算法多優,總會產生碎片。
  • 內存的分配和釋放由程序員操做管理

3. 值類型和引用類型之間的相互轉化多線程

  • 裝箱:把值類型轉化爲引用類型的過程叫作裝箱,如把int包裝爲NSNumber。
  • 拆箱:把引用類型轉爲值類型的過程叫作拆箱,如把NSNumer轉爲int。

2、Objective-C內存管理的對象的方法性能

1. 引用計數atom

  • 表示對象被引用的次數,經過它能夠判斷對象是否被回收。
  • 若是引用計數爲0,對象回收,不爲0則不回收。
  • 當對象執行alloc、new、copy或者retain時,引用計數加1,release時,引用計數減1。

3、Objective-C管理內存的方式線程

1. 手動內存管理機制:MRC設計

  • MRC模式下,全部的對象都須要手動的添加retain、release代碼來管理內存。
  • 使用MRC,須要遵照誰建立,誰回收的原則。也就是誰alloc,誰release;誰retain,誰release。
  • 當引用計數爲0的時候,必須回收,引用計數不爲0,不能回收,若是引用計數爲0,可是沒有回收,會形成內存泄露。若是引用計數爲0,繼續釋放,會形成野指針。爲了不出現野指針,咱們在釋放的時候,會先讓指針置爲nil。

2. 自動內存管理機制:ARC指針

1)ARC模式下的property變量修飾詞對象

  • 強引用strong:至關於retain,使用以後,計數器值+1。
  • 弱引用weak:至關於assign,使用不會改變計數器的值,指針指向的地址被釋放後,會自動置爲nil。
  • retain:引用計數值+1,即對象持有者的個數+1。
  • assign:設置變量時使用,不設計引用計數。
  • copy:拷貝對象。
  • readwrite與readonly:限制訪問者的權限。
  • atomic與nonatomic:原子操做與非原子操做。原子操做適用於多線程,對共享資源的安全訪問。非原子操做多用於非多線程,能夠提升性能。

 2)自動釋放池

自動內存釋放使用@autoreleasepool關鍵字聲明一個代碼塊,若是一個對象在初始化時調用了autorelase方法,那麼當代碼塊執行完以後,在塊中調用過autorelease方法的對象都會自動調用一次release方法。這樣一來就起到了自動釋放的做用,同時對象的銷燬過程也獲得了延遲(統一調用release方法)。

  1. autorelease方法不會改變對象的引用計數器,只是將這個對象放到自動釋放池中; 
  2. 自動釋放池實質是當自動釋放池銷燬後調用對象的release方法,不必定就能銷燬對象(例如若是一個對象的引用計數器>1則此時就沒法銷燬); 
  3. 因爲自動釋放池最後統一銷燬對象,所以若是一個操做比較佔用內存(對象比較多或者對象佔用資源比較多),最好不要放到自動釋放池或者考慮放到多個自動釋放池; 
  4. ObjC中類庫中的靜態方法通常都不須要手動釋放,內部已經調用了autorelease方法;
相關文章
相關標籤/搜索