標籤:objective-c ios 記憶體管理
一 基礎原理
1 為什麼需要記憶體管理
因為行動裝置記憶體有限,每個app所佔用的空間有限。
當app佔用記憶體空間過多時,系統會發出記憶體警告,這是回收一些不在使用的記憶體。
例如:不再使用的類對象和執行個體。
2 管理對象
任何繼承自NSObject類的對象
3 記憶體地區
堆:主動分配空間,需要管理
棧:局部變數,自動管理
例如:
int a = 1;
Person* p = [[Person alloc] init];
a,p都放在棧區
Person分配的空間在堆區
二 引用計數
1 定義
每個OC對象都有一個引用計數,是一個4個位元組的整數,表示“被引用的次數”。
可以使用retainCount方法查看一個對象的引用計數。
2 作用
一個對象建立(alloc/new/copy)時為1;
引用計數變為0時,會被系統回收。
引用計數變不為0時,它佔用的記憶體不可能被回收,除非整個程式退出。
3 引用計數操作
retain +1
release -1
4 對象銷毀
一個對象引用計數為0時,其佔用的記憶體會被系統銷毀。
被銷毀時,系統會向對象發送一條dealloc訊息。
因此,一般需要重寫dealloc方法,首先調用父類的dealloc,然後釋放自己的資源。
對象銷毀後,其記憶體被回收,繼續使用會導致程式crash(野指標)。
*dealloc不能手動調用
樣本
@interface Person@property int m_nAge;@end@implementation Person- (void)dealloc{NSLog(@"dealloc");// 驗證對象是否被回收[super dealloc];}@end#import <Foundation/Foundation.h>int main(){// 預設為1Person* p = [[Person] init];NSUInteger count = [p retainCount];NSLog(@"retainCount == %ld", count);// +1,變為2,retain傳回值為對象本身[p retain];// -1,變為1[p release];// -1,變為0,被回收,被回收之後p變為野指標,指向的對象變為僵死對象// 不能對僵死對象發送任何訊息,包括retain[p release];// 報錯:EXC_BAD_ACCESS// p.m_nAge = 10// 防止野指標錯誤,因為給nil對象發送訊息不報錯,只有警告p = nil;// 開啟殭屍檢查之後才報錯:setXXX,message sent to deallocated instancep.m_nAge = 10return 0;}
使用被回收的對象報錯:EXC_BAD_ACCESS,訪問了一塊被回收的記憶體,即野指標錯誤
三 總結
1 基本方法
retain
release
retainCount
dealloc
2 概念
殭屍對象:所佔用內被回收的對象:
野指標:指向殭屍對象
null 指標:沒有指向任何地址,儲存的地址為0/NULL/nil
iOS複習筆記4:記憶體管理