[objective-C] 08.記憶體管理2
阿新 • • 發佈:2019-01-25
// main.m檔案
NSString *name = [[NSString alloc] initWithFormat:@"張三"]; // name引用計數為1
Person *p = [[Person alloc] init]; // p引用計數為1
[p setName:name]; // name引用計數為1, _name引用計數為1, setName:內部name執行了copy方法
[name release]; // name引用計數為0, name佔有的記憶體被釋放
NSLog(@"%@", [p name]); // 此處列印的是_name
NSString *newName = [[NSString
[p setName:newName]; // _name先是引用計數為0,newName引用計數為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
// copy適用於接受了NSCopying協議的物件,因為只有接受了NSCopying協議,物件才能執行copy操作