参考文章:
今天在测试项目的支付宝支付功能时,在调用支付宝客服端后出现了crash(心中一万只草泥马)。如下图
看到这个libobjc.A.dylib`objc_release,至少知道原因了对象被释放了。于是乎百度了下libobjc.A.dylib是干嘛用的。知道了libobjc.A.dylib包含了runtime的东东。想起来之前用MethodSwizzle 实现对数组、字典 等系统方法的安全校验。测试了下发现确实是这个引起的。
知道了是MethodSwizzle引起的问题,同时还要找到是哪个对象被释放了。好在前一天在cocoachina看到了这篇《EXC_BAD_ACCESS的本质详解以及僵尸模式调试原理》。那么好说先定位到底是哪个对象。
僵尸调试步骤:
1、以下方法适用于Xcode的6和7,单击顶部菜单栏的Product-Scheme-Edit Scheme,并选中Edit Scheme。
2、在左侧选中Run ,在上方打开 Diagnostics选项。要启用僵尸对象,勾选 Enable Zombie Objects选框。
开启僵尸调试后终于打印出被释放的对象了
哦!原来是键盘的问题。于是参考《iOS [UIKeyboardLayoutStar release]: message sent to deallocated》 这篇文章,就是把用到MethodSwizzle的那个类改成MRC模式,我的项目是ARC,同时修改MethodSwizzle方法的实现顺利解决问题。
步骤如下:
1、点击项目导航文件--> 选中Targets--> 选择 Build Phases --> 展开Compile Sources 找到
双击该行文件,在右边弹出框输入 -fno-objc-arc
2、修改实现方法