关于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中的Block使用以及ARC和MAR下的内存管理方式

1.什么是Block?     Block是属于C语言框架     Block是一种数据类型(类似int)     Block是一段代码块,只有在被调用的时候被执行(类似函数和方法) ...
  • XieEXiaoZhang
  • XieEXiaoZhang
  • 2016年07月25日 15:19
  • 970

黑马程序员——OC基础03—内存管理

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-一、内存管理的基本管理1.由于移动设备的内存有限,所以我们必须确保在需要的时候分配内存,在程序运行结束的时候释放占...
  • Peide04271915
  • Peide04271915
  • 2015年11月18日 11:28
  • 235

OC的手动内存管理基础(IOS开发)

OC的内存管理分为三种:          1,手动内存管理(MRC).          2,自动内存管理(ARC)          3,垃圾回收      IOS系统并不支持垃圾回收,现在主要使...
  • aa605397965
  • aa605397965
  • 2015年07月13日 23:39
  • 765

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月14日 16:16
  • 9000

Swift OC 内存管理

???? 1.??????? ???????,???????????,?????????????????alloc?free,?????????????????????,????,????????...
  • JoeTongOwn
  • JoeTongOwn
  • 2016年08月02日 15:01
  • 142

OC学习笔记五 内存管理(property 参数)

@property不带参数会默认生成标准的setter getter方法,不会帮助管理内存。 加上了参数才会帮忙管理内存。 基本数据类型(int float....)不需要写参数,或者也可以加上(as...
  • wangjiwei2010
  • wangjiwei2010
  • 2015年08月12日 11:25
  • 555

C++/Objective-C内存管理对比学习

C++内存管理内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈。存储函数中局部变量,函数结束时会自动释放。 堆。由new分配的内存块,由应用程序控制它的回收(需要手动回收),即一...
  • linyousong
  • linyousong
  • 2016年02月27日 22:38
  • 343

Objective-C 内存管理机制

一、Objective-C内存管理的对象。二、为什么要使用内存管理。三、Objective-C管理内存的方式。四、与内存有关的修饰符。五、MRC与ARC混编...
  • lover0920
  • lover0920
  • 2016年01月05日 08:57
  • 1651

OC-内存管理的一些要点

创建一个BOOK对象,对其属性进行声明 定义。 @property 属性声明 定义了对属性的赋值  -(void) dealloc 方法在对象销毁的时候进行调用; #import @...
  • qq285016127
  • qq285016127
  • 2014年06月12日 00:21
  • 806

oc关于内存管理

在cocoa中,当向一个集合对象中添加一个对象时,,集合会主动持有对它的所有权,而从集合中拿掉一个对象时,集合会主动放弃对它的所有权。就是说我们不需要进行retain和release。 这里的reta...
  • lozzz
  • lozzz
  • 2015年03月01日 12:20
  • 229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于OC内存管理-03
举报原因:
原因补充:

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