您的位置:首页 > 职场人生

黑马程序员--有关OC内存管路set方法的思考

2015-07-01 23:11 225 查看
基本数据类型不需要内存管理,管理的是对象类型

分析:

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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: