內存管理是在程序運行期間分配內存,使用並釋放的過程。一個好的程序會盡可能的用很少的內存。
當你的程序結束的時候,你要知道如何去管理應用程序的內存,不需要的對象要釋放掉。
內存管理的示例圖如下:
從圖中可以看出,當沒有指針指向某個對象的時候,這個對象將會被摧毀。
Objective-c提供了兩種內存管理的方式:
1、MRC(manual retain-release):手動的內存管理,從英文也可以看出有retain和release來管理內存;
2、ARC(Automatic Reference Counting):自動內存管理,編譯器在編譯的時候,編譯器會在適當的地方插入相應的內存管理的代碼。
防止內存相關的問題的好方法:
兩種方法導致不正確的內存管理:
①釋放或重寫正在使用的數據會導致內存錯誤,主要引起程序崩潰,錯誤或者用戶數據錯誤;
②沒有釋放不在使用的數據導致內存泄漏內存泄漏就是分配好的內存空間沒有釋放或者不在使用,泄漏導致你的應用程序在使用不斷增加的內存,會導致很差的系統表現,或者你的應用程序被終結。
內存管理政策
基於內存管理的規則
內存管理模式基於對象的擁有權,任何對象都擁有一個或多個所有者,只要一個對象還有一個或多個所有者,對象將繼續存在,如何對象沒有所有者,那麼運行期間系統將會自動destroy他。
-你對你創建的對象擁有所有權;
-你可以通過retain來獲得一個對象的擁有權;
-如果你不需要某個對象,你必須放棄對這個對象的擁有權;
-你不能釋放你不是擁有者的對象。
自動釋放池
-自動釋放池通過@autoreleasepool標記
@autoreleasepool {
// Code that creates autoreleased objects.
}
在自動釋放池結束的時候,在塊裏面的對象會接收到autorelease
信息,系統會在適當的時候釋放這個對象。
-跟其他代碼塊一樣,自動釋放池是可以重疊的
@autoreleasepool {
// . . .
@autoreleasepool {
// . . .
}
. . .
}
如果你在自動釋放池外面發送一個autorelease信息,Cocoa會記錄一個合適的錯誤信息。
-可以自己創建一個自動釋放池,以下三種情況:
-如果你的程序不是基於UI框架的;
-如果你寫了一個循環,裏面產生了大量的臨時變量對象;
-如果你創建第二線程(你必須創建自己的自動釋放池一旦你的線程開始執行,否則你的程序將會泄露對象)。
ARC的新規則①你不能很明確的應用dealloc,或者繼承或引用retain, release,retainCount, or autorelease;
-使用@selector(retain), @selector(release), 等等也是禁止的;
-在ARC中使用自定義的dealloc方法不需要調用 [super dealloc];
-你仍然可以使用CFRetain, CFRelease, 和Core Foundation-style相關的其他功能;
②你不能使用NSAllocateObject orNSDeallocateObject;
③在C結構體中不能使用對象指針;
④id和*沒有實質性區別;
⑤你不能使用NSAutoreleasePool對象:
-ARC允許@autoreleasepool blocks代替,這比NSAutoreleasePool更有優勢;
⑥你不能使用內存區域;
⑦你不能以new開頭來命名一個存取器。
Weak引用
Weak引用並不延長他指向的對象的生命時間,當沒有strong指向這個對象的時候會自動的變爲nil。
你應當充分利用這些特性來管理你程序中的對象圖,特別是ARC並不反對strong引用,利用weak來保證你不創建一個環。
在ARC中,strong是對象類型默認的。
更多的內存管理知識,請大家參照蘋果開發者文檔。