Instruments之Zombies检测僵死对象

671 阅读1分钟

什么是僵尸对象

在OC中,对象被释放后所占用的内存在没有被复写(重新分配给其他对象)前称为僵尸对象,这时野指针是可以访问该内存的,因为对象的数据还在,所以程序不会报错。但是该内存一旦重新分配给其他对象就会出现问题。所以我们的程序中需要避免出现僵尸对象,在合适的位置对象指针赋值为nil

Zombies使用方法

1. 打开instruments

image.png

2. 选择zombies

image.png

3. 点击左上角红点开始运行记录

image.png

运行后的效果

image.png

3. 重现错误

在模拟器上操作程序,直到程序崩溃。崩溃时,如果是僵尸对象导致的,instruments的右上角会弹出提示框。

image.png

提示框

提示框上提示 RechargeViewController有一个僵尸对象,点击最后的箭头即可显示详情。

4. 详情列表

点击后出现详情列表,看不懂没关系,直接翻到最后一行

image.png

5. 错误定位

最后一行,zombie 可以看到是SKProductsRequest,原来是内购的商品请求成为僵尸对象了。在充值界面内购请求商品,但是返回的时候,RechargeViewController被销毁,SKProductsRequest却没有赋值为nil。回到内购代码那里修改一下即可。

image.png

代码修改如下

- (void)dealloc{
    NSLog(@"销毁");
    self.request.delegate = nil;
    [self.request cancel];
    self.request = nil;
}

错误总结:一般导致僵尸对象的原因都是通知引起,观察者在需要移除的地方没有移除,发现错误位置后,查找一下当前页面的通知和观察者,没移除的要移除。

参考

iOS开发错误调适instruments之Zombies的使用(检测僵尸对象)