iOS Zombie Objects(僵尸对象)原理探索

详情:https://zhiyongzou.github.io/2017/08/25/iOS-Zombie-Object-%E5%83%B5%E5%B0%B8%E5%AF%B9%E8%B1%A1-%E5%8E%9F%E7%90%86%E6%8E%A2%E7%B4%A2/

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 指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象。僵尸类能够相应所有的选择器,响应方式为:打印一条包含消息内容及其接收者的消息,然后终止应用程序。

你可能感兴趣的