zoukankan      html  css  js  c++  java
  • 僵尸对象和野指针

    僵尸对象:内存已经被回收的对象。

    野指针:指向僵尸对象的指针,向野指针发送消息会导致崩溃。野指针错误形式在Xcode中通常表现为:Thread 1:EXC_BAD_ACCESS,因为你访问了一块已经不属于你的内存。

    1、什么是僵尸对象?

      简而言之,就是过度释放的对象。

    2、僵尸对象有什么特点?

      如果一个对象a被变成了僵尸对象,那么,在进行下面的判断时,a是会被系统当成一个对象来进行判断的。但是,如果你使用a进行其它操作,系统将会提示你send message to a dealloc 对象。如下

    if(!a)
    {
       a = [[A alloc]init];      
    }
    a.color = [UIColor redColor];

    具体实例如下:

    “僵尸指针”就是野指针的一种情况,即该指针指向的对象已经被释放,但是却没有对当前指针赋值为nil。

    简单的来说,僵尸对象是已经被释放的对象。如果在程序中再度使用该对象,一般会出现如下报错:

    unrecognized selector sent to instance

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

    为什么不默认开启僵尸对象检测呢?

    • 因为一旦开启,每次通过指针访问对象的时候.都会去检查指针指向的对象是否为僵尸对象.
    • 那么这样的话 就影响效率了.
    • . 如何避免僵尸对象报错.

      • 当1个指针变为野指针以后. 就把这个指针的值设置为nil
    • 僵尸对象无法复活.

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

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

  • 相关阅读:
    nginx js、css多个请求合并为一个请求(concat模块)
    Web客户端语言HTML、XHTML和XML相关知识介绍
    正则小略
    你可能不知道的5个功能强大的 HTML5 API
    你须知道的30个CSS选择器 »
    css3 media媒体查询器用法总结
    深入java虚拟机学习 -- 类的加载机制
    ElasticSearch和solr的差别
    idea 使用debugger技巧
    vue学习问题总结(一)
  • 原文地址:https://www.cnblogs.com/fengmin/p/6141674.html
Copyright © 2011-2022 走看看