注意在写代码的时候,只要创建了对象,用完这个对象之后必须记得要调用release方法,要使用这个对象的时候必须调用retain方法。
比如拿人看书这个例子:
首先有一个人p1看书b,
Person *p1 = [[Person alloc]init];//p1计数器=1
Book *b = [[Book alloc] init];//b计数器=1
[p1 setBook:b]; //b计数器=2
[p1 release]; //p1计数器=0
P1 = nil;
人当中有个setBook方法,让人能拿一本书去看,上述[p1 setBook:b]
就是调用了该方法,P1 = nil是清空p1,下面就是setBook方法的实现:
- (void)setBook:(Book *)book
{
/*首先要做一个判断,book=_book时,b的计数器就为1,表示传进来的还是旧对象,不是新对象。如果此时再[ _book realease],b的计数器就为0了,后面再[bookretain]就会报错,因为b无法”死而复生“,所以必须保证book != _book*/
if(book!= _book){
[_book realease];//b计数器=1
_book= [book retain];
}
}
上述_book = [book retain]就是让人去拿一本书看,以书为参照物,就是这本书有一个人在看,[book retain]返回的就是书对象,在返回这个个新的书对象之前,应先将原来的书对象release掉,故在调用[book retain]前应先调用[ _book realease]。在最上面调用了[p1 release],说明这个人离开不看书了,所以此时应调用书的release。也就是在人这个对象被销毁的时候调用这本书的release方法,如下:
- (void)dealloc
{
[ _book release]; //b计数器=0
NSLog(@”Person对象被回收”);
[superdealloc];
}