ios开发-Objective-C之内存管理机制

1.概述

作为一个开发者我们都明白在程序运行的过程中要去创建大量的对象,和C语言/JAVA类似,在OC中创建对象的时候,它是存储在堆中的(eg-1.1),系统并不会自动释放内存的,(这里要注意基本类型都是放在栈中的,它由系统自己管理);如果一个对象被创建了不能及时的去释放它所占用的内存或者出现内存泄露(eg1.2)等问题,在C#/JAVA中都是通过垃圾回收来解决这个问题,那么在OC我们该去如何处理这个问题呢.
在OC中没有类似的垃圾回收机制,因此它的内存管理就需要开发人员自己去手动维护.

<span style="font-size:18px;">eg-1.1</span>
<span style="font-size:18px;">Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。
ClassA *obj1 = [[ClassA alloc] init];</span>
<span style="font-size:18px;"></pre><pre name="code" class="html"></span>
<strong><span style="font-size:18px;">eg-1.2 </span></strong>
<pre name="code" class="html"><span style="font-size:18px;">classA * object1 = [[classA alloc]init];
classA * object2 = object1;</span>
<span style="color:#ff0000;"><span style="font-size:18px;">// 这里假如object1和object2都有hello这个方法</span></span>
<span style="font-size:18px;">[object1 hello];// 输出hello</span>
<span style="font-size:18px;">[object1 dealloc];</span>
<span style="font-size:18px;">[object2 hello];// <span style="color:#ff0000;">能够执行这个行和下一行吗?</span></span>
<span style="font-size:18px;">[object2 dealloc];

</span>
<span style="font-size:18px;"><span style="color: rgb(255, 102, 102);">答案: 当然不可以了,</span>因为这两个都是指向一个对象的,当object1 调用dealloc时候,已经销毁这个对象了,object2怎么还可以调用hello呢,这时候object2实际是个无效的指针了.(对吧,伙计!!!!!)那怎么解决呢,看下面代码</span>

 
 

2.OC中采用的引用计数(retain count 或者 ref count),来处理这个问题. 对象的内部保存一个数字,便是被引用的次数.
例如, 一个对象被两个指针所指向(这里指引用) 那么它的retain count 为2. 需要销毁对象的时候, 不直接地哦啊用dealloc,  而是去调用release, release会让rentain count自动减1, 只有retain count等于0的时候,系统才会调用dealloc真正意义的销毁这个对象.(实例代码如下:)
ClassA* object1 = [[classA class]init];//对象生成时候,计数器count 为1
[object1 release];// release 使retain count 计数减1, 这时候retain count 为0, dealloc自动被调用,这时候对象被销毁
这里问题又来了,刚才那个无效指针真的解决了吗????? 答案是:NO,NO,NO
// 那就带你穿越一下去看看上面那个问题的过程
ClassA * object1 = [[classA alloc]init];// 这时候 retain count = 1
ClassA * object2 = object1;// retain count = 1
[object1 release];//retain count = 0,这时候dealloc自动会被调用,对象销毁
[object2 hello];
[object2 release];
[obejc2 release];
注:[object1 release]之后,object2依然还是个无效的指针,说明问题还是在的,还是那个答案:NO,NO,NO

3. OC指针赋值时候,retain count不会自动解决,需要手动retain.
<span style="font-size:18px;">ClassA * object1 = [classA alloc]init];// retain count = 1;</span>
<span style="font-size:18px;">ClassA * object2 = object1; // retain count = 1;
</span>
<span style="font-size:18px;">[object2 retain]; // retain count = 2;</span>
<span style="font-size:18px;">[object1 hello];</span>
<span style="font-size:18px;">[object1 release];// retain count = 1;(2 - 1)</span>
<span style="font-size:18px;">[object2 hello];</span>
<span style="font-size:18px;">[object2 release];// retain count = 0;调用dealloc,对象销毁</span>
<span style="font-size:18px;">这样问题就被解决了,  你是不是感觉这样做有点繁琐啊, 箱要更简单的办法解决它呢!(那就继续看下一条吧 
参考与:<a target=_blank href="http://www.cnblogs.com/Kiros/archive/2012/01/10/2318073.html">点击打开链接</a>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值