Zombie Object 有什么用
- 僵尸对象一种用来检测内存错误(EXC_BAD_ACCESS)的对象,它可以捕获任何对尝试访问坏内存的调用。
- 如果给僵尸对象发送消息时,那么将在运行期间崩溃和输出错误日志。通过日志可以定位到野指针对象调用的方法和类名。
如何开启Zombie Object检测
在Xcode中设置Edit Scheme -> Diagnostics -> Zombie Objects
Zombie Object是如何被触发的
再次调用 [aPeople release] 可以看到程序断在forwarding,从此处的汇编代码中可以看到关键字NSZombie,在调用abort( )函数退出进程时会有对应的信息输出@"*** -[%s %s]: message sent to deallocated instance %p"。所以可以大概猜出系统是在消息转发过程中做了手脚。
结论
系统在回收对象时,可以不将其真的回收,而是把它转化为僵尸对象。这种对象所在的内存无法重用,因此不可遭到重写,所以将随机变成必然。
系统会修改对象的 isa 指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象。僵尸类能够相应所有的选择器,响应方式为:打印一条包含消息内容及其接收者的消息,然后终止应用程序。