標籤:
對象的保留和所有權的釋放:
int main(int agrs,char *argv[]){ @autoreleasepool{ Person *person = [[Person alloc]initWithName:@“Tom"]; //retainCount=1 [person setName: name]; //retainCount = 2; [person release]; }}@interface Person@property(nonatomic,retain)(NSString*)name;@end 詳解:在主函數main中建立了一個perosn對象,此時,main函數擁有對象person的所有權,保留計數器retainCount=1;緊接著,因為類Person的執行個體變數name類型retain是強引用,因此,main函數中person對象調用setName方法時,類Person也擁有了person對象的所有權,所以,Person類就將保留計數器加1用來保留住person對象,此時的retainCount=2;根據對象誰建立,誰釋放的原則,main函數中main函數擁有的perosn對象被main函數使用完後就釋放其所有權,隨即被main函數release掉了。此時,保留計數器retainCount=1,此時系統不會調用dealloc方法來銷毀對象,對象被保留給了類Person。等到最後,類Person用完了對象person後,類Person也應該釋放person對象的所有權,因此,就調用重寫的dealloc方法,在這個方法內release掉person所有權,retainCount=0,在完成父類的【super dealloc】後,這個perosn對象就徹底的被銷毀了。 總之兩句話:(1)誰在調用這個對象,就必須獲得其所有權,將對象保留住,防止直接被銷毀了; (2)誰建立的對象,誰負責釋放;誰調用的對象,誰負責釋放。
Objective-C:保留計數器思想的詳解(對象的保留和所有權的釋放)