内存泄露之自动内存管理(ARC)

来源:互联网 发布:智能建站 软件 编辑:程序博客网 时间:2024/06/05 02:15

一.单个对象的内存管理

       在Xcode5.0之前都是手动内存管理的,但是在5.0之后就不需要程序猿管理了,为什么呢?因为Xcode会自动在我们需要释放的地方加上release,这也是Xcode的一项功能吧.这样就能免去了我们对代码的花太多的时间关心内存释放的问题了,我们就可以专心的提高代码实现某一项功能了.在ARC模式下,系统的内存到底是怎么管理的呢?
        在ARC的机制下,只要对象没有被强指针(strong)指向的话,就会释放.这就是ARC模式下内存释放的主要特性.那么我们先来看看单个内存的管理吧.
        方法的实现:

       主函数:

       结果显示:

       为什么在ARC模式下,还是能在对象销毁的时候调用delloc方法呢?那对象又是怎么销毁的呢?是这样的:delloc在ARC模式下在对象销毁的时候也是能够执行的,只是并不能调用[super delloc]方法,所以delloc还是执行了.第二个问题就是由于自动释放池(@autoreleasepool)的效果,所以当对象出了自动释放池的范围,那么对象就会释放,也就是说释放的时候调用了delloc.具体的图我将为大家画出来.

       为什么上面标明的是强指针呢?由于只要没有其它修饰符修饰,只要对象创建出来,默认就是被强指针指向.释放原因是:由于对象只要出了@autoreleasepool的范围,那么对象就会被销毁,也就是(*car)先销毁,对象在没有强指针指向的情况下,也就销毁了.所以这是单个对象在ARC模式下的内存管理.

二.多个对象的内存管理

       当一个对象中存在另外一个对象的属性,也就是说用一个最简单的例子说明下,就是你有一条狗,而狗也拥有一个主人,那么就会存在多个指针之间的指向关系.我们先来看代码吧.


        上面两段代码就是在强指针下的代码.


       由于是强指针指向的原因,delloc并不会调用,也就是说对象并没有释放.我们来看图:

       看上面的图片可以知道,由于dog指针和person指针在对象创建出来的时候是强指针指向Dog和Person对象,那么什么时候释放呢?在对象出了@autoreleasepool的范围的时候dog和person指针就释放了,但是由于Dog对象和PPerson对象分别有strong指针互相指向,那么这里就出问题了,就造成Dog和Person对象无法释放了,也就是不能调用delloc方法了.那么怎么才能达到释放的效果呢?我们先从代码入手,然后再分析系统框图.
图一:

图二:

        只要将Person或者Dog中的strong改为weak就好,但是这里不推荐两个都改为weak,因为如果是这样的话,指针太弱了,不安全.最好是strong和weak连用.下面是改完之后的结果.

     上面所说的方法也能改善循环引用问题.这就是在ARC模式下的内存泄露以及管理的问题和方法,如果有什么issue,请给我留言,我们一起交流.谢谢!!!!!

       
1 0
原创粉丝点击