僵尸对象和野指针

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

野指针:指向僵尸对象的指针,向野指针发送消息会导致崩溃。野指针错误形式在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个僵尸对象是没有意义。

原文地址:https://www.cnblogs.com/fengmin/p/6141674.html