1. 程式人生 > >[objective-C] 08.記憶體管理2

[objective-C] 08.記憶體管理2

// main.m檔案

NSString *name = [[NSString alloc] initWithFormat:@"張三"]; // name引用計數為1

Person *p = [[Person allocinit]; // p引用計數為1

[p setName:name]; // name引用計數為1, _name引用計數為1, setName:內部name執行了copy方法

[name release]; // name引用計數為0, name佔有的記憶體被釋放

NSLog(@"%@", [p name]); // 此處列印的是_name

NSString *newName = [[NSString

 allocinitWithFormat:@"小華"]; // newName引用計數為1

[p setName:newName]; // _name先是引用計數為0newName引用計數為1_name引用計數為1,因為setName:內部[newName copy];

[newName release]; // newName引用計數為0

NSLog(@"%@", [p name]); // 列印的是_name

[p release]; // p引用計數為0

// 上面的兩處NSLog(@"%@", [p name]); 都不會引起野指標異常。每次[p setName:xx];都會先釋放舊的物件,copy

新的物件,即:_name引用計數為先減1,變為0,然後_name = [newName copy], _name引用計數變為1;下次如果給p設定新的名字anotherName_name引用計數先減1,變為0,然後_name = [anotherName copy], _name引用計數為1。上面的程式碼執行完畢後,name應用技術為0name所佔記憶體被系統回收了,newName引用計數為0,所佔的記憶體被系統回收,p引用計數為0p所佔的記憶體被系統回收。_name引用計數為1,佔用著記憶體,不能得到釋放。(程式碼執行完畢時_name佔有的記憶體沒有釋放,引起了記憶體洩露)蘋果為了保證程式的安全,retain
對應的getter方法先是retainautorelease

// copy適用於接受了NSCopying協議的物件,因為只有接受了NSCopying協議,物件才能執行copy操作