1. 程式人生 > >iOS 記憶體管理基本原則

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的搞定。