<3>内存管理--set方法-2(用新对象代替旧对象时,就好比是一个人原来有辆250码的车(旧对象),然后要换一辆3000码的车(新对象))
1. 旧对象与新对象不是同一个对象时:当一个对象换了当前它所使用的对象的时候,就要让 被使用的旧对象release一次。方法是在set方法中让旧对象release(就是在换对象的时候让被换掉的旧对象release一次,被使用的新对象retain一次)
2. 旧对象与新对象是同一个对象时:上面的逻辑就会出现问题,因为换对象的时候,set方法都要release旧对象,但是如果被传入的‘新’对象和‘旧’对象是同一个对象时,‘旧’对象一release,它就可能已经被系统回收了,这时再对‘新’对象进行retain就是非法的. 所以我们在换对象的时候,先要if判断一下:旧对象跟新对象一样就不执行(不换),不一样才会执行(换)
3. 总结:
<1. 只要调用alloc,就必须有release(或者autorelease)
<2. set方法的代码规范
1> 基本数据类型:直接赋值
- (void)setAge:(int)age
{
_age = age;
}
2> OC对象类型
- (void)setCar:(Car *)car
{
//1.先判断是不是同一个对象
if(_car != car)
{
//2.旧对象release一次
[_car release];
//3.新对象retain一次
_car = [car retain];
}
}
<3. dealloc方法的代码规范
1> 一定要[super dealloc],而且要放到最后
2> 对self(当前)所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
4. 不管对象是怎么产生的,只要没有使用alloc,就不能用release(如NSString *的对象)
5. 这种情况,release的顺序也有要求,所以很烦,很不合理不友好。