Obj-c記憶體管理
來源:互聯網
上載者:User
Obj-c為每個對象提供一個內部計數器,負責跟蹤對象的引用次數,引用次數的增減分別對應NSObject的retain和release方法,當引用次數為0時,對象將會得到馬上回收。對象的建立 alloc和copy系列方法,都會發送一條retain訊息,引用計數都會加1, "是誰生的孩子,就應該誰來養"重寫dealloc方法 當對象包含其他對象時,就得在dealloc方法中釋放他們 -(void) dealloc{ [myvar release]; ....... [super release]; } 記憶體自動釋放池 Autorelease pool提供了一個對象容器,當對象發送autorelease訊息時,對象的引用計數並不減少,記憶體自動釋放池會添加一條相應的記錄,記錄下對象的這種要求,當記憶體自動釋放池發送release訊息時,會通知池中的所有對象去發送release訊息,引用計數才會真正減少模板代碼 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [myobject autorelease]; ...... [pool release];屬性的記憶體管理 設定屬性和構造方法中初始化成員變數的值時很容易引發記憶體泄露 //錯誤的寫法 -(void) setTitle:(NSString*) newTitle{ //舊的title的記憶體並沒有得到釋放 //並且這樣只是對指標的賦值,很容易引發問題 title = newTitle; } //正確的寫法(相當於屬性參數中的retain參數) -(void) setTitle:(NSString*) newTitle{ //確保傳進來的newTitle不會被release [newTitle retain]; //釋放舊的title [title release]; //建立一個新的title title = [[NSString alloc] initWithString:newTitle]; [newTitle release]; } //正確的寫法(相當於屬性參數中的copy參數) -(void) setTitle:(NSString*) newTitle{ //確保傳進來的newTitle不會被release [newTitle copy];//只對實現了NSCopying協議的對象成立 //釋放舊的title [title release]; //建立一個新的title title = [[NSString alloc] initWithString:newTitle]; [newTitle release]; } assign參數適用於基本類型直接賦值 -(void) setAge:(int) newAge{ age = newAge; }構造方法記憶體管理寫法 -(id) initWithTitle:(NSString*) newTitle{ self = [super init]; if(self){ [self setTitle:newTitle]; //這種寫法會發生記憶體泄露和指標問題,是錯誤的寫法 //self->title = newTitle; } }