黑马程序员--有关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];
}
分析:
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];
}
相关文章推荐
- 黑马程序员--OC内存管理之循环retain问题
- 一位俄罗斯程序员移民美国的故事
- 你与优秀程序员之间的差别本质!
- 程序员自我修养
- 黑马程序员-java基础-数组的三种重要操作方法:
- 黑马程序员——Java基础---线程的另一个总结(3)--互斥,线程锁
- 从其他程序员身上学习,取长补短
- 摘录-IT企业必读的200个.NET面试题-04 字符串、集合和流的使用
- 2015年换工作感想
- 黑马程序员---多线程
- 黑马程序员-java基础-总结的几点问题
- 面试题3 ----二维数组中的查找
- 蛋糕求职记--小时候淘气,长大了淘宝
- 程序员如何快速准备面试中的算法
- 黑马程序员——Java基础---线程的另一个总结(2)--定时器
- 程序员必须知道的8大排序和3大查找
- 黑马程序员——java基础---关键字、常量、变量、运算符
- 面试题
- 黑马程序员-----IO流
- 黑马程序员——Java基础---线程的另一个总结(1)--基本创建方法