.set方法的内存管理
当时用alloc或者new 创建一个对象,就必调用release 或autorelease
1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
3.谁retain,谁release
4.谁alloc,谁release
当一个人拥有一个 书的对象后,需要在实现中如下操作:
#import "Person.h"
@implementation Person
- (void)setBook:(Book *)book
{
//1.先判断是不是新传进来的对象
if(book != _book)
{
[_book release];//若没有旧对象,则没有影响
_book = [book retain];//对新对象做一次retain
}
}
- (void)dealloc
{
[_book release];
NSLog(@"Person对象被回收");
[super dealloc];
}
@end
set方法在使用中经常会存在如下的问题:
1)set方法写法(一)
原对象无法释放造成的内存泄露
-(void)setCar:(Car*)car{
_car= [car retain];
}
2)set方法写法(二)
原对象能够释放,但是引起新的问题,set自己的时候,造成的野指针
-(void)setCar:(Car*)car{
[_car release];//先释放上一个对象
_car= [car retain];
}
3)set方法写法(三)解决上述问题:
判断新传递的对象是否是原来的对象,如果不是原来的对象则释放,然后再retain
-(void)setCar:(Car*)car{
//判断_car存放的是否是 形参对象,如果不是,则执行 [_car realease];
if(_car!=car) {
[_carrelease];//先释放上一个对象,(注意第一次是向nil发送release消息)
_car= [car retain];
}
}