内购的导致程序崩溃坑(2)

问题描述

既上次的问题解决之后,临上线时又发现了一个新的崩溃bug,好在及时发现并改正,过完美好的周末,今天补上

由于真机闪退,很难定位到原因,解决办法有如下:

  1. 手机手机的崩溃日志,查看崩溃日志

  2. 通过第三方插件来追踪bug(腾讯的bugly),可惜项目里面没有

  3. 真机进行僵尸对象调试

真机调试僵尸对象

程序崩溃于内购的控制器,报错信息”EXC_BAD_ACCESS(code=1,address=0x10)”

1.打开Xcode->Prefrencese(command + ,),设置输出信息

2.配置环境变量:Product->Scheme->Edit Scheme,如下勾选

开启后,程序在运行时,如果访问僵尸对象,会给出较为准确的定位信息,帮助解决问题;
该功能的原理是,在对象释放(retainCount为0)时,使用一个内置的Zombie对象替代被释放的对象.所以向该对象执行的操作(发送消息,函数调用),都会触发异常,抛出调试信息

3.继续执行问题出现的步骤,调试程序,发现输出界面 -[HFPurchaseVC retain]:message send to deallocated instance错误日志

根据输出日志发现是控制器HFPurchaseVC 已经释放了,但是还在向其发送引用,究其原因是由于进入此控制器的时候,是向苹果请求商品的request方法先走,而这个request的代理对self有引用,造成了野指针访问

解决办法 在控制器销毁的时候将代理置为nil

1
2
3
4
5
6
7
8
- (void)dealloc{
self.request.delegate = nil;
if ([SKPaymentQueue defaultQueue]) {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
}
这个人很帅<br>他什么都不想说<br>