最近集中优化crash,出现一个unrecognized selector sent to instance 0x157aeb130的问题,一般这种明显的问题(button对应的selector找不到,基本不是没写就是方法名写错了,要么就是button提前被release了),
应该在测试前期就可以发现的。
但是查看错误地址的时候出现了:
-[UIApplication(BTGMethodSwizzler) btg_swizzleSendEvent:] (in xxx) (UIApplication+BTGMethodSwizzler.m:28)
可我代码里没有做过Swizzler这种转发魔法.
然后查其他crash,出现一例Application received signal SIGSEGV的问题
一般这种东西,很难直接从友盟里看出有用信息,常见的可能性就是
1,SIGABRT 2,EXC_BAD_ACCESS(SIGSEGV)
换句话说:1.过度release 2.unrecogized selector。
再次根据错误地址分析如下:
根据错误的地址进一步分析
okey,又出现这个了
后来查下来是使用了一个第三方的bug收集sdk. 里面出现了错误.
但是上线的时候注册这个sdk key的地方我是关掉的啊,怎么会带上去呢?
Method Swizzling
直接参考:
cocoachina
(备注:简单说下,我知道大部分人可能懒得再点进去看,Method Swizzling 本质是基于runtime,然后可实现的最简单的东西就是消息转发,就是把2个方法替换一下,执行A方法的去执行方法B,执行B方法的去执行方法A.. 当然,实际上复杂很多,大家点进去看就好)
other flags link
(备注:Other Linker Flags有3种方法,最常见的用途是加载静态类,比如第三方sdk. 具体3种方法:
-ObjC
-all_load
-force_load
```)
因为很多sdk当被你Other Linker Flags加入后,如果他写了一些category方法,那就可能被引用到. 我这里就是。
即使我代码里并没有专门调用这个sdk 的方法. (其实这个调用也只是和sdk有交互,他本身被调用时-ObjC的机制做决定的)
所以出现了,我误以为我并没有使用这个sdk,但是实际还是跑了sdk的代码
甚至于因为其代码导致了我app的crash.
解决方案:
1. 上线版本,移除sdk
2. sdk不移除,直接在Other Linker Flags -release版本移除就好.
因为我们平时线下测试还是用到这个sdk的,所以直接移除包不是很方便,还是选择了后者