野指针和僵尸对象

1、什么是野指针

C语言中的野指针:定义1个指针变量,没有初始化,这个指针变量指向1块随机的空间,这个指针就是野指针

Objective-C语言中:指针指向的对象已经被回收了

2、对象回收的本质

内存回收的本质:

申请1个变量,实际上是向系统申请指定字节数的空间,这些空间系统就不会再分配给别人

当变量被回收时,代表变量占有的字节空间从此以后可以分配给别人了

但是字节空间中存储的数据还在

回收对象

指的是对象占用的空间可以分配给别人了

当这个对象所占用的空间没有分配给别人之前,其实对象数据还在

3、僵尸对象

1个已经被释放的对象,但是这个对象所占的空间还没有分配给别人,这样的对象叫做僵尸对象

我们通过野指针去访问僵尸对象的时候,有可能有问题,有可能没问题,这由僵尸对象占用的空间是否被重新分配决定

4、如何避免访问僵尸对象出错

我们认为只要对象成为僵尸对象,无论如何,都不允许访问

这时候可以打开僵尸对象实时检查机制,即启用NSZombie Objects检测,只要访问的是僵尸对象,无论空间是否被分配,都会报错

步骤如下

5、为什么不默认打开僵尸对象检测

一旦打开僵尸对象检测,那么每访问1个对象的时候,都会先检查这个对象是否为僵尸对象,这样是极其消耗性能的

6、如何避免使用野指针访问僵尸对象报错

当1个指针成为野指针以后,将这个指针的值设置为nil

当1个指针的值为nil,通过这个指针去调用对象的方法,不会报错,只是没有任何反应

但是如果通过直接访问属性->就会报错

7、无法复活1个僵尸对象

即如果想用发送retain消息的方法使引用计数器由0变成1是不会成功的

猜你喜欢

转载自blog.csdn.net/laya1211/article/details/127962261