僵尸对象和野指针

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值