最近集中優(yōu)化crash,出現(xiàn)一個(gè)unrecognized selector sent to instance 0x157aeb130的問題,一般這種明顯的問題(button對應(yīng)的selector找不到,基本不是沒寫就是方法名寫錯(cuò)了,要么就是button提前被release了),
應(yīng)該在測試前期就可以發(fā)現(xiàn)的。
但是查看錯(cuò)誤地址的時(shí)候出現(xiàn)了:
-[UIApplication(BTGMethodSwizzler) btg_swizzleSendEvent:] (in xxx) (UIApplication+BTGMethodSwizzler.m:28)
可我代碼里沒有做過Swizzler這種轉(zhuǎn)發(fā)魔法.
然后查其他crash,出現(xiàn)一例Application received signal SIGSEGV的問題
一般這種東西,很難直接從友盟里看出有用信息,常見的可能性就是
1,SIGABRT 2,EXC_BAD_ACCESS(SIGSEGV)
換句話說:1.過度release 2.unrecogized selector。
再次根據(jù)錯(cuò)誤地址分析如下:
根據(jù)錯(cuò)誤的地址進(jìn)一步分析
okey,又出現(xiàn)這個(gè)了
后來查下來是使用了一個(gè)第三方的bug收集sdk. 里面出現(xiàn)了錯(cuò)誤.
但是上線的時(shí)候注冊這個(gè)sdk key的地方我是關(guān)掉的啊,怎么會(huì)帶上去呢?
Method Swizzling
直接參考:
cocoachina
(備注:簡單說下,我知道大部分人可能懶得再點(diǎn)進(jìn)去看,Method Swizzling 本質(zhì)是基于runtime,然后可實(shí)現(xiàn)的最簡單的東西就是消息轉(zhuǎn)發(fā),就是把2個(gè)方法替換一下,執(zhí)行A方法的去執(zhí)行方法B,執(zhí)行B方法的去執(zhí)行方法A.. 當(dāng)然,實(shí)際上復(fù)雜很多,大家點(diǎn)進(jìn)去看就好)
other flags link
(備注:Other Linker Flags有3種方法,最常見的用途是加載靜態(tài)類,比如第三方sdk. 具體3種方法:
-ObjC
-all_load
-force_load
```)
因?yàn)楹芏鄐dk當(dāng)被你Other Linker Flags加入后,如果他寫了一些category方法,那就可能被引用到. 我這里就是。
即使我代碼里并沒有專門調(diào)用這個(gè)sdk 的方法. (其實(shí)這個(gè)調(diào)用也只是和sdk有交互,他本身被調(diào)用時(shí)-ObjC的機(jī)制做決定的)
所以出現(xiàn)了,我誤以為我并沒有使用這個(gè)sdk,但是實(shí)際還是跑了sdk的代碼
甚至于因?yàn)槠浯a導(dǎo)致了我app的crash.
解決方案:
1. 上線版本,移除sdk
2. sdk不移除,直接在Other Linker Flags -release版本移除就好.
因?yàn)槲覀兤綍r(shí)線下測試還是用到這個(gè)sdk的,所以直接移除包不是很方便,還是選擇了后者