关于OC内存管理-03

原创 2015年07月07日 23:41:57

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]并把其放在最后。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

OC代码14_内存管理

  • 2015-06-02 14:07
  • 428B
  • 下载

OC中的内存管理

  • 2015-10-21 18:02
  • 22KB
  • 下载

uc笔记03---环境变量,内存管理,进程映像/堆栈区别,虚拟内存,malloc 特点

1.    环境变量     #env        // 查看环境变量          环境表  ...

OC内存管理详解

  • 2014-05-30 10:22
  • 18KB
  • 下载

oc内存管理.

  • 2013-11-27 18:11
  • 168KB
  • 下载

Objective-c学习笔记03——内存管理

Objective-C可以开发apple家族系列产品的软件,这里记录成笔记方便日后复习: Objective-c学习笔记01——简介 Objective-c学习笔记02——类(面向对象) ...

oc高级编程--ios内存管理

  • 2016-08-30 10:15
  • 5.63MB
  • 下载

OC 中的内存管理

  • 2014-05-30 09:26
  • 261KB
  • 下载

201215-03-19---cocos2dx内存管理--详解

由于cocos2dx我们的使用c++写的,所以内存管理就是一个绕不过去的坎,这个你不懂内存只懂业务逻辑的话,还玩什么c++,今天看了半天这个东西,其实本质上是理解的,但是就是有一个过不去的坎,终于在今...

Java面向对象03-对象内存管理,继承的意义

内存管理Java程序所需内存由JVM来管理,分配 堆 存储所有new出来的对象 成员变量的生命周期: 创建对象时存储在堆中,对象回收时一并消失 没有任何引用指向的对象称为垃圾 垃圾回收器(GC)不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)