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