黑马程序员--有关OC内存管路set方法的思考
来源:互联网 发布:家庭生活记账软件 编辑:程序博客网 时间:2024/05/07 02:41
基本数据类型不需要内存管理,管理的是对象类型
分析:
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];
}
0 0
- 黑马程序员--有关OC内存管路set方法的思考
- 黑马程序员23——OC之内存管理(set方法的内存管理)
- 黑马程序员--oc中set方法的内存管理
- 黑马程序员---OC set方法的内存管理
- 黑马程序员-oc中方法的使用及有关知识
- 黑马程序员-OC-set方法的基本操作
- 黑马程序员——OC——set方法内存管理和property
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- 黑马程序员-Object C之set方法的内存管理
- 黑马程序员---04set方法的内存管理
- 黑马程序员——IOS基础——OC内存管理-set方法内存管理及微博模型设计
- 黑马程序员--OC-内存
- 【黑马程序员】【OC语言】get和set方法
- oc的set方法内存管理
- OC set方法的内存管理
- 黑马程序员-OC的内存管理笔记
- 黑马程序员——OC学习之成员变量的get,set方法多种实现
- 黑马程序员----OC学习之成员变量的get,set方法多种实现
- malloc, realloc, calloc, alloca
- ios教程(3)--UIImageView、UILabel、UIButton实现一个小案例
- jsp (一)
- 用虚拟机安装、启动、停用hadoop2.6.0(实现hdfsHA和ResourceManagerHA)步骤小记
- 百度分页效果之纯jsp版
- 黑马程序员--有关OC内存管路set方法的思考
- 计算机专业英语教程(第二版)
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- Socket send函数和recv函数详解
- printf用法之打印2进制,八进制,十进制,十六进制
- ASP.Net MVC学习(一)
- 您适合从事web前端开发吗?
- 布局 selector 图片选择布局
- MySQL基础笔记(四) 索引