iOS 內存管理基本原則

我們知道objc中創建對象是存放在堆中的(基本數據類型除外,是由系統自己管理,並存放在棧中),系統不會自動釋放堆中的內存。如果創建完的對象存放在堆中後並使用完沒有得到及時的釋放,會佔用的內存。但是objc沒有GC(垃圾回收機制),因此需要開發者手動管理內存。蘋果公司共推出了3中內存管理機制:ARC(自動內存管理)、MRC(手動內存管理)、自動釋放池。下面根據以下幾個方面討論一下內存管理。

1.內存管理的目的

a.不釋放或者覆蓋正在使用的內存空間;

b.釋放已經不需要的內存空間,以防治內存泄漏。

2.內存管理的一些概念

ARC

ARC是蘋果公司iOS5推出的新功能,代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了(通過指定的語法,讓編譯器在編譯代碼時,自動生成實例的引用計數管理部分代碼。)。

好處:

1代碼比以前需要手動管理內存,簡單了,不需要時刻擔心內存泄漏;
2
代碼高速化,使用編譯器來管理內存引用計數,減少了低效代碼的可能性。
壞處:

1)一些老代碼,以及以往的第三方庫,使用起來比較麻煩。

MRC

MRC是手動內存管理。與其對變量的管理相關的方法有:retain,release和autorelease。retain和release方法操作的是引用記數,當引用記數爲零時,便自動釋放內存。

(1retain,該方法的作用是將內存數據的所有權附給另一指針變量,引用數加1,即retainCount+= 1;
(2
release,該方法是釋放指針變量對內存數據的所有權,引用數減1,即retainCount-= 1;
(3)autorelease,該方法是將該對象內存的管理放到autoreleasepool中。

自動釋放池

自動釋放池(Autorelease pool)是OC的一種內存自動回收機制,可以將一些臨時變量通過自動釋放池來回收統一釋放。自動釋放池本事銷燬的時候,池子裏面所有的對象都會做一次release操作。與之對應的方法是autorelease任何OC對象只要調用autorelease方法,就會把該對象放到離自己最近的自動釋放池中(棧頂的釋放池)。

引用計數

任何一個oc對象都會有一個這樣的屬性retainCount,這個retainCount就是引用計數,當對象被創建的時候,該對象的引用計數爲初始化值1,當retainCount爲0時,會被該對象所佔內存會被釋放,使用retain的時候引用計數爲+1。

3.內存管理的原則

內存管理的原則是:誰創建,誰釋放;誰引用,誰管理。即當你使用new、alloc、copy或者mutablecopy創建對象的時候,該對象的引用計數爲初始化值1,當你使用retain向對象發送消息時,你將擁有該對象的控制權,並且引用計數爲+1,當你不在使用該對象的時候,你需要release或者autorelease釋放該對象,使之引用計數-1,當引用計數爲0時,該對象將被釋放。

4.實際中一些使用操作

a.ARC和MRC混編

現在的開發過程中居多使用ARC,但是常常使用一些MRC的第三方的庫,這時候我們需要使用-fno-objc-arc來進行標示,如果使用MRC混編ARC的時候,需要使用-fno-objc-mrc來標示ARC的文件。

5.面試中遇到的一些關於內存管理的問題

a.簡述你理解的內存管理;

簡述內存管理的原則,以及內存管理的方法就行。

b.給出一段代碼來讓你說出引用計數

知道使用new、alloc、copy或者mutable copy,引用計數爲初始值1,再使用retain的話,引用計數爲+1,使用release或者autorelease會使引用計數-1。然後根據實際情況來說明基本這種題soso的搞定。

發佈了39 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章