内存泄露之手动内存管理(MRC)

来源:互联网 发布:特朗普减税 知乎 编辑:程序博客网 时间:2024/06/05 03:40

一.单个对象内存管理

       由于移动设备的内存是有限的,如果创建的对象用完不及时的销毁(释放)的话,就会造成内存泄露.如果该对象的内存空间释放了,但是依旧在使用的话,那么就是僵尸对象.同时指向僵尸对象的指针就是野指针.对于内存管理的原则是,不用的对象就要回收其所占用的空间,防止造成内存泄露.并且我们要知道,内存泄露主要是针对堆区的对象.其它的区域并不存在内存的泄露.
       下面我将为大家一次的说明单个对象和多个对象,怎么处理内存泄露的问题.
       单个内存泄露情况1:



       为什么会造成这样的原因呢?就是因为创建对象后没有release,就造成了内存的泄露.怎么解决呢?我们来看下面的代码吧.


      创建完后,如果不用就直接release就可以了.这是单个内存泄露的第一种情况.

      单个内存泄露情况2:没有遵守内存管理的原则.


     没有遵守内存的管理原则:谁创建,谁release;谁retain,谁release;谁引用,谁release.所以会造成内存的泄露,那么怎么解决呢?


      直接在release一次就可以了,这是第二种情况.

      单个内存泄露情况3:不当的使用了nil,造成了内存泄露.


       为什么?是在对象创建过后,直接将nil赋值给了指向对象的指针,也就是指针dog的值一直是0,那么后面的一系列的代码所代表的都是0在run和0在release.解决的办法,就是不能在对象创建后,直接给对象赋值nil.

       然后就是第四种内存泄露了:用对象作为参数传给另外一个对象或者在内部不当的使用了retain,也会造成内存泄露.



       上面的情况就造成了内存泄露,下面就是解决办法.


       上面所有的代码,只要当内存完全释放的时候就会调用delloc.


      上面所有的都是有关单个内存的泄露问题.

二.多个对象的内存泄露问题

      首先我们要知道为什么多个对象会有内存泄露问题呢?比如,我们可以假设一个人和一辆车,然后人开车去某个地方,最后是车在跑,最后车到达目的地了,然后创建的对象并没有释放,造成了内存的泄露.那么我就拿人开车去某个地方来说明内存泄露的问题.
      这是Car的(.m)文件:

       然后就是人的(.m)文件:

       那么我们来看看main的部分:

       最后运行的结果是人到达饿目的地.但是这里就有问题了,车的delloc和人得delloc并没有执行,那么就造成了内存的泄露了.那么怎么解决呢?

       结果显示人的delloc和车的dello都执行了,那么又有问题了,那样做是不是很不方便呢?我们能不能用一个方法直接封装起来呢,这样就算外部在怎么的访问都是一样的,就不需要考虑野指针的问题了,那么怎么解决呢?我们来看看下面的解决代码(这种方法主要是针对创建多个对象的问题).

      上诉所写得代码是在set方法里面直接控制,也是核心.管理原则是:如果一个类中,有其他类的对象(关联关系),set方法书写的时候,要判断是否是同一个对象,release旧的值,retain新的值.这是对多个对象的手动管理方法.

三.僵尸对象怎么检测

      图一:

    图二:

     图三:

      以上就是对内存的管理,也就是手动内存管理.有什么issue给我留言,我们一起讨论,谢谢!!!!!!




1 0
原创粉丝点击