Instruments为我们提供了检测僵尸对象的工具:Zombies。使用这个工具,将会自动开启Enable Zombies Objects模式,而不需要手动去设置
Enable Zombies Objects检测原理
Zombies Objects 官方解释:一个对象已经解除了它的引用,已经被释放掉,但是此时仍然是可以接受消息,这个对象就叫做Zombie Objects(僵尸对象)。
其检测原理如下所示主要分为两步,具体可参考iOS-底层原理36:内存优化(一) 野指针探测
-
生成僵尸对象
-
触发僵尸对象
在iOS中,导致僵尸对象的常见场景有以下三种:
- 【释放后再释放】:一个对象已经被释放(或自动释放),程序会再次尝试释放它。
- 【该保留未保留】:一个对象本应被保留的时候却没有被保留。
- 【释放后调用】:在对象被释放后,会对其进行其他调用。
Zombies 使用
- 创建一段代码
__unsafe_unretained NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
-
使用Profile,选择Zombies,点击左上角红色按钮启动
-
在程序运行期间,如果检测到僵尸对象,会出现一个小旗标志,双击打开如下所示
-
点击messaged的箭头,会定位到定位到具体的代码及调用栈
-
双击调用栈对应的方法后,可以查看具体的代码
参考文章
iOS开发错误调适instruments之Zombies的使用
iOS知识小集 第9期
官方文档:Finding zombies