ios 发送请求时按home_使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法...

在测试支付宝支付功能时遇到App崩溃,通过分析发现是由于MethodSwizzle引起的对象释放问题。使用僵尸对象调试定位到是键盘相关对象被错误释放。通过将使用MethodSwizzle的类改为MRC模式并修改方法实现,成功解决了问题。
摘要由CSDN通过智能技术生成

参考文章:

今天在测试项目的支付宝支付功能时,在调用支付宝客服端后出现了crash(心中一万只草泥马)。如下图

96b06d448b2a99f9e4ecc9a32cbf9433.png

看到这个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选框。

6b959077146b9bf95481d97bf63e4b4d.png

开启僵尸调试后终于打印出被释放的对象了

a3e63e581d68930ad454b2d7b1f94072.png

哦!原来是键盘的问题。于是参考《iOS [UIKeyboardLayoutStar release]: message sent to deallocated》  这篇文章,就是把用到MethodSwizzle的那个类改成MRC模式,我的项目是ARC,同时修改MethodSwizzle方法的实现顺利解决问题。

步骤如下:

1、点击项目导航文件--> 选中Targets--> 选择 Build Phases --> 展开Compile Sources 找到

6cfc7bd30f1ced8d7186686b67618fb0.png

双击该行文件,在右边弹出框输入 -fno-objc-arc

0dce58c007d3bcd7843ac3fadb226ca3.png

2、修改实现方法

ec327f91c31b5fe7e2369666252630a9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值