1. 打开instruments

2. 选择zombies

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

运行后的效果

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

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

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

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

代码修改如下
- (void)dealloc{
NSLog(@"销毁");
self.request.delegate = nil;
[self.request cancel];
self.request = nil;
}
错误总结:一般导致僵尸对象的原因都是通知,观察者在需要移除的地方没有移除,发现错误位置后,查找一下当前页面的通知和观察者,没移除的要移除。
网友评论