关于OC内存管理-03
来源:互联网 发布:合肥学c语言的培训班 编辑:程序博客网 时间:2024/05/22 15:02
1.对于上篇文章,对象的实例变量(OC对象类型)的setter方法,只是执行一次retain操作,则这个程序是有缺陷的。可以想到的是,如果我们不小心在main.m里多执行了一次p.book = b,则我们又执行了一次retain操作,此时计数器又加上了1,不符合内存管理原则。但是如何修改呢。 我们可以在执行retain操作做一个判断,如果传进来的对象参数和实例变量不相等 则进行retain操作。修改代码如下:
<pre name="code" class="html"><pre name="code" class="objc">-(void)setBook:(Book *)book{ //先判断是否为新传进来的对象if(_book != book){ <span style="white-space:pre"></span>_book =[book retain];}}
2.虽然执行多次p.book = b 的问题得以解决,但是我们发现这个方法并不完善。如果我们突然不想要这本书,而想要另一本书了呢?即在main.m里p.book = b 下面再创建一个书对象b2即 Book *b2 = [[Book alloc] init]; p.book = b2;
[b2 release];
这时候显然b2对象计数器已经为2,程序执行完后。b2和p对象都已经被回收。而b并没有被回收,因为当执行p.book = b2操作时并没有让b对象计数器减1,既然已经不用书对象了,我们就应该让b对象减1,所以改善后的代码:
-(void)setBook:(Book *)book{ //先判断是否为新传进来的对象if(_book != book){//对旧值进行release操作 [ _book release]//对新值进行retain操作 _book =[book retain];}}
总结:
set方法的内存管理:
1.先判断传进来的是否为新的对象
2.在对旧值(原先实例变量存储的值)进行release操作
3.再对新值(新传进来的对象)进行一次retain操作
值得注意的是:一定要在dealloc方法里对占用的对象进行一次release操作。并且写此方法时,一定要写
[super dealloc]并把其放在最后。
0 0
- 关于OC内存管理-03
- oc关于内存管理
- oc关于内存管理
- 关于OC的内存管理
- 关于oc中内存管理问题
- 关于OC的内存管理-01
- OC内存管理-OC笔记
- OC内存管理
- Oc-内存管理
- OC内存管理
- OC 内存管理
- oc 内存管理
- OC内存管理
- oc -内存管理 笔记
- OC之【内存管理】
- OC内存管理小记
- OC内存管理(转载)
- OC-内存管理
- App Extensions 基本学习 iOS8
- SPOJ 375 Query on a tree(初学树链剖分)
- 每个人都懂得敏捷开发 (软件工程), 为何产品开发的效率与质量还是这么的烂?
- 跳表的一种实现
- android 记录
- 关于OC内存管理-03
- 【JavaEE小练手】Servlet实现HttpUrl数据获取
- 每天一个linux命令(14):head 命令
- java--初始化和清理
- Yocto 学习总结
- 理解$watch ,$apply 和 $digest --- 理解数据绑定过程
- 每天一个linux命令(15):tail 命令
- Ajax实现网页无闪自动局部刷新(邮件接收提示)
- 算法导论—中位数与顺序统计量