------ android培训、java培训、期待与您交流! ----------
set方法内存管理
我们来看一下,最严谨的方法
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
{
Car * _car;
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setCar:(Car *)car;
- (Car *)car;
@end
#import "Person.h"
@implementation Person
- (void)setCar:(Car *)car
{
if ( car != _car) {
// 对当前正在使用的车release
[_car release];
// 对新车做一次retain
_car = [car retain];
}
}
- (Car *)car
{
return _car;
}
- (void)setAge:(int)age
{
// 基本数据类型不需要retain
_age = age;
}
- (int)age
{
return _age;
}
- (void)dealloc
{
// 当人不在了,代表不用车了
// 对车做一次release
[_car release];
NSLog(@"%d岁的person对象被回收!", _age);
[super dealloc];
}
@end
首先来看看dealloc方法
dealloc方法的代码规范
1. 一定调用[super dealloc],一定放到最后面
2. 对当前对象所拥有的其它对象,做一次release
- (void)dealloc
{
[_car release]; // 当人不在了,也代表着不想用车了那么就要给车做一次release
[super dealloc];
}
再来看看set方法
- (void)setCar:(Car *)car
{
// 1.先判断传进来的是否为新对象
if ( car != _car)
{
// 2.对旧对象进行一次release
[_car release];
// 3.对新对象进行一次retain
_car = [car retain];
}
}
这是最严谨的set方法,这样最遵循内存原则
现在我们来看一个错误写法
Student *stu = [[Student alloc] init];
stu.car = [[Car alloc] init];
[stu release];
这代码看起来没有问题,可是这存在内存泄露问题
先看一下stu,刚创建的时候计数器为1,后面没有变化,最后release一次计数器为0,没有问题。
再来看看car呢。
stu.car = [[Car alloc] init];
右边Car刚创建时计数器为1,stu.car方法计数器为2,当stu释放car的计数器-1,最后car的计数器一直为1,无法释放。
这样的代码就可以称为垃圾代码。