iOS 底层原理39:Instruments系列(八)Zombies

iOS 底层原理 文章汇总

Instruments为我们提供了检测僵尸对象的工具:Zombies。使用这个工具,将会自动开启Enable Zombies Objects模式,而不需要手动去设置

Enable Zombies Objects检测原理

Zombies Objects 官方解释:一个对象已经解除了它的引用,已经被释放掉,但是此时仍然是可以接受消息,这个对象就叫做Zombie Objects(僵尸对象)。

其检测原理如下所示主要分为两步,具体可参考iOS-底层原理36:内存优化(一) 野指针探测

  • 生成僵尸对象


    Instruments_08_01.png
  • 触发僵尸对象


    Instruments_08_02.png

在iOS中,导致僵尸对象的常见场景有以下三种:

  • 【释放后再释放】:一个对象已经被释放(或自动释放),程序会再次尝试释放它。
  • 【该保留未保留】:一个对象本应被保留的时候却没有被保留。
  • 【释放后调用】:在对象被释放后,会对其进行其他调用。

Zombies 使用

  • 创建一段代码
 __unsafe_unretained NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
  • 使用Profile,选择Zombies,点击左上角红色按钮启动


    Instruments_08_03.png
  • 在程序运行期间,如果检测到僵尸对象,会出现一个小旗标志,双击打开如下所示


    Instruments_08_04.png
  • 点击messaged的箭头,会定位到定位到具体的代码及调用栈


    Instruments_08_05.png
  • 双击调用栈对应的方法后,可以查看具体的代码


    Instruments_08_06.png

    Instruments_08_07.png

参考文章

iOS开发错误调适instruments之Zombies的使用
iOS知识小集 第9期
官方文档:Finding zombies

推荐阅读更多精彩内容