基本数据类型不需要内存管理,管理的是对象类型
分析:
int main()
{
Person *p = [[Person alloc] init]; //p->1
p.age = 20;
Car *c1 = [[Car alloc] init]; //c1->1
c1.speed = 250;
p.car = c1; // 或者[p setCar: c1]; p拥有c1,c1->2
Car *c2 = [[Car alloc] init]; //创建c2,c2->1
p.car = c2; //p将车换成了c2,c2->2
[c2 release]; //c2->1
[c1 release]; //c1->1
[p release]; //此时p的计数器变为0,调用dealloc方法 p->0, c2->0, c1->1
//此时的c1计数器为1,所以并没有释放,出现错误
}
Person类的dealloc方法:
- (void)dealloc
{
//当人不在了,车也没用了,对车做一次release操作
[_car release];
[super dealloc];
}
所以set方法中如果发现传入的对象和之前的对象不同,要对旧对象作一次release操作,对新对象作一次retain操作
set方法应改为:
- (void)setCar: (Car*)car
{
if (car != _car)
{
[_car release];
}
_car = [car retain];
}
总结:
内存管理代码规范:
1.只要调用了alloc,必须有release(autorelease)
如果对象不是通过alloc产生,就不需要release
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];
}
分析:
int main()
{
Person *p = [[Person alloc] init]; //p->1
p.age = 20;
Car *c1 = [[Car alloc] init]; //c1->1
c1.speed = 250;
p.car = c1; // 或者[p setCar: c1]; p拥有c1,c1->2
Car *c2 = [[Car alloc] init]; //创建c2,c2->1
p.car = c2; //p将车换成了c2,c2->2
[c2 release]; //c2->1
[c1 release]; //c1->1
[p release]; //此时p的计数器变为0,调用dealloc方法 p->0, c2->0, c1->1
//此时的c1计数器为1,所以并没有释放,出现错误
}
Person类的dealloc方法:
- (void)dealloc
{
//当人不在了,车也没用了,对车做一次release操作
[_car release];
[super dealloc];
}
所以set方法中如果发现传入的对象和之前的对象不同,要对旧对象作一次release操作,对新对象作一次retain操作
set方法应改为:
- (void)setCar: (Car*)car
{
if (car != _car)
{
[_car release];
}
_car = [car retain];
}
总结:
内存管理代码规范:
1.只要调用了alloc,必须有release(autorelease)
如果对象不是通过alloc产生,就不需要release
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];
}