美文网首页
野指针和僵尸对象(转)

野指针和僵尸对象(转)

作者: shannoon | 来源:发表于2016-11-24 15:14 被阅读88次

    野指针.
    C语言: 当我们声明1个指针变量,没有为这个指针变量赋初始值.这个指针变量的值是1个垃圾指 指向1块随机的内存空间。
    OC语言: 指针指向的对象已经被回收掉了.这个指针就叫做野指针.

    僵尸对象
    . 内存回收的本质.
    申请1块空间,实际上是向系统申请1块别人不再使用的空间.
    释放1块空间,指的是占用的空间不再使用,这个时候系统可以分配给别人去使用.
    在这个个空间分配给别人之前 数据还是存在的.
    OC对象释放以后,表示OC对象占用的空间可以分配给别人.
    但是再分配给别人之前 这个空间仍然存在 对象的数据仍然存在.

    僵尸对象: 1个已经被释放的对象 就叫做僵尸对象.

    . 使用野指针访问僵尸对象.有的时候会出问题,有的时候不会出问题.
    当野指针指向的僵尸对象所占用的空间还没有分配给别人的时候,这个时候其实是可以访问的.
    因为对象的数据还在.
    当野指针指向的对象所占用的空间分配给了别人的时候 这个时候访问就会出问题.

    所以,你不要通过1个野指针去访问1个僵尸对象.
    虽然可以通过野指针去访问已经被释放的对象,但是我们不允许这么做.

    . 僵尸对象检测.
    默认情况下. Xcode不会去检测指针指向的对象是否为1个僵尸对象. 能访问就访问 不能访问就报错.
    可以开启Xcode的僵尸对象检测. 那么就会在通过指针访问对象的时候,检测这个对象是否为1个僵尸对象 如果是僵尸对象 就会报错.

    . 为什么不默认开启僵尸对象检测呢?
    因为一旦开启,每次通过指针访问对象的时候.都会去检查指针指向的对象是否为僵尸对象.
    那么这样的话 就影响效率了.

    . 如何避免僵尸对象报错.
    当1个指针变为野指针以后. 就把这个指针的值设置为nil

    僵尸对象无法复活.
    当1个对象的引用计数器变为0以后 这个对象就被释放了.
    就无法取操作这个僵尸对象了. 所有对这个对象的操作都是无效的.

    因为一旦对象被回收 对象就是1个僵尸对象 而访问1个僵尸对象 是没有意义.

    相关文章

      网友评论

          本文标题:野指针和僵尸对象(转)

          本文链接:https://www.haomeiwen.com/subject/rsibpttx.html