zoukankan      html  css  js  c++  java
  • OC内存管理zombie对象 撩课

      当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题.

      内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内存,耗费内存资源直至程序结束.

      野指针则是指:当一个指针指向一个对象时,此对象已经被系统回收.然后当再次通过该指针去操作对象时,则会出现野指针错误.而当系统回收该对象时,并不会立即销毁,而此时,该对象则成为僵尸对象.

      在开发过程中,有人可能发现,有时僵尸对象也能访问.这是为什么呢?主要原因是因为XCode为了提高编码效率,并不会实时监测僵尸对象.所以也就意味着它依然留在内存,所以造成"对象被销毁后依然可以通过指针进行访问"的假象.

      那么,怎样解决这个问题呢?很简单,只需要在XCode中设置实时监测僵尸对象就可以了具体步骤如下:

      edit scheme --- Diagnostics --- 勾选Enable Zombie objects 即可.

      但这样会比较耗性能,导致编译时间延长.

      接下来,简单介绍下僵尸对象的销毁过程:

      假如一个对象person,其retainCount值为1,此时执行[person release],则会有如下过程

      1,判断retainCount - 1 == 0 (注意,此时对象依然存在,并未成为僵尸对象,而retainCount也未被真正减一)

      2,进入该类dealloc方法

      3,在dealloc方法中如果调用了[super dealloc],则此时对象retainCount == 0,该对象也成为僵尸对象.

      4,注意,如果没有调用[super dealloc]方法,那么该对象不会成为僵尸对象,其retainCount也不会减一.也就等于[person release]没有效果.

      僵尸对象细节:1,向其发送消息,会出现野指针错误

             2,如果在其类内部,可以通过成员变量名(地址)继续访问其成员属性,修改其值

  • 相关阅读:
    祝师傅新婚快乐 :)
    NetBeans IDE 6.8 里程碑 2 已经可用!
    GRETA库在VS 2005环境下的编译经验
    祝师傅新婚快乐 :)
    NetBeans 时事通讯(刊号 # 74 Sep 30, 2009)
    忆父亲
    NetBeans 时事通讯(刊号 # 74 Sep 30, 2009)
    Miss Nev great app
    订阅我不会怀孕
    数据结构排序: 两路归并排序算法 子逸 博客园
  • 原文地址:https://www.cnblogs.com/dashunzi/p/3732912.html
Copyright © 2011-2022 走看看