对象的保留和所有权的释放:
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)谁创建的对象,谁负责释放;谁调用的对象,谁负责释放。