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