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