[iOS]第三方sdk,如果不用請移除

最近集中優(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的問題


屏幕快照 2016-01-26 下午4.49.05.png

一般這種東西,很難直接從友盟里看出有用信息,常見的可能性就是
1,SIGABRT 2,EXC_BAD_ACCESS(SIGSEGV)
換句話說:1.過度release 2.unrecogized selector。

再次根據(jù)錯(cuò)誤地址分析如下:
根據(jù)錯(cuò)誤的地址進(jìn)一步分析


屏幕快照 2016-01-26 下午4.52.29.png

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的,所以直接移除包不是很方便,還是選擇了后者
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容