博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SET方法内存管理
阅读量:4514 次
发布时间:2019-06-08

本文共 1258 字,大约阅读时间需要 4 分钟。

SET方法内存管理

情况一:Person类中有一个属性car

-(void) setCar:(Car *) car{

  _car = car;   // line 1

}

这样做是不妥的,主方法中调用一下说明这个不妥:

Person * p = [[Person alloc]init];

Car * c = [[Car alloc]init];  

p.car = c;  // 调用上面set方法中的line 1 ,因无alloc copy new ,故 虽然 _car 使用并指向了 Car对象,但对Car对象的retainCount并无影响!

[c release]; // Car对象retainCount 为 0 ,Car 对象消失

------此处,Person类对象还没消失,但其内的_car属性已无意义,因其所指的对象已经消失--------

[p release]

 

情况二:为改进情况一,修改set方法如下

-(void) setCar:(Car *) car{

  _car = [car retain];   // line 2

}

-(void)dealloc{

   [_car release];  // 覆写dealloc方法,既然_car retain了一下Car对象,那么Person对象覆灭时候,作为其内属性的_car也应该release掉这次引用,这也是符合黄金法则的。

   [super dealloc];

}

其意思是,既然_car要使用Car对象,就应该对Car对象做一次引用保留,增加一次retainCount,说明_car在这个属性在使用着Car对象。

但这样仍然是不完善的,主文件中调用一下说明这个不完善:

Person * p = [[Person alloc]init];

Car * c1 = [[Car alloc]init];  

p.car = c1;  // c1的Car对象 引用计数为 2

Car * c2 = [[Car alloc]init];  

p.car = c2;  // c2的Car对象 引用计数为 2。同时,_car 不再指向 c1的Car对象!

[c2 release]; // c2 retainCount 1

[c1 release]; // c1 retainCount 1

[p release];  // p覆灭,同时c2 retainCount 0; c1 retainCount 1,造成内存泄露

 

情况三:继续改进情况二

-(void) setCar:(Car *) car{

    if(_car != car){

    [_car release];   // 如果_car有旧值,那么这一步会使其释放所保留其指向对象的引用;如果没有旧值,等效于 [nil release] 也无不可

    _car = [car retain];   

    }

}

转载于:https://www.cnblogs.com/chenqingxiao/p/4405040.html

你可能感兴趣的文章
弱弱的玩下Javascript
查看>>
二叉树相关操作
查看>>
在webstorm开发微信小程序之使用阿里自定义字体图标
查看>>
序列化模块/模块/包
查看>>
eclipse maven plugin 插件 安装 和 配置
查看>>
收集一些复杂有用的正则表达式
查看>>
子数组求和之大数溢出
查看>>
浏览器预览office文件(word,Excel,等)
查看>>
MySQL工具汇总
查看>>
cookie
查看>>
如何使用Eclipse编译C,C++,JAVA程序
查看>>
php小程序-文章发布系统
查看>>
从“智猪博弈”看所谓“大国责任”
查看>>
Day3:Spring-JDBC、事务管理
查看>>
模块的四种形式
查看>>
Jmeter属性和变量
查看>>
java并发编程:并发容器之CopyOnWriteArrayList(转)
查看>>
python基础——面向对象进阶下
查看>>
Linux vi 命令详解
查看>>
本地如何搭建IPv6环境测试你的APP
查看>>