本篇內(nèi)容涉及到oc中runtime的swizzling,方法交換的使用
這個是關(guān)于微博SDK的內(nèi)部存在的一個bug。
這個bug是這樣的,用戶在使用App時,如果從后臺進入App,會莫名的閃退Crash。而且這種情況是偶現(xiàn),并不是每次都能重現(xiàn)出來。
從Bugly上分析,crash 報在微博的SDK上。但是微博SDK是以靜態(tài)庫的形式開放給我們使用,我們并不能看到它的源碼和實現(xiàn)原理。那該怎么辦呢?這有很多種方法。
- 首先肯定是向微博官方的開發(fā)者反饋問題發(fā)送郵件,因為這是官方開發(fā)者的一個bug,由他們來解決。從而來更新微博SDK。
- 目前我所遇的情況,反饋給微博官方后,等了好幾天都沒有得到解決的方法。上面領導就來催促了,怎么這個問題還沒解決。我們就不能干等著了。既然官方不能解決,我們只能試著去解決了。
從Bugly上分析出的問題在于:有2個方法一直Crash
-[WBSDKFMDatabase executeUpdate:error:withArgumentsInArray:orDictionary:orVAList:] (WBSDKFMDatabase.m:812)
-[WBSDKFMDatabase executeQuery:withArgumentsInArray:orDictionary:orVAList:] (WBSDKFMDatabase.m:530)
解決的思路很簡單,就是拿到這個2個方法,并重寫這2個方法。
我在WBHttpRequest類基礎上新建一個類別。
還是直接上代碼看好:

A2FB3CBA-A59C-4286-8504-4A54CD390AFA.png
關(guān)鍵在于獲取方法的返回值是什么屬性
SEL sel = @selector(executeUpdate:error:withArgumentsInArray:orDictionary:orVAList:);
SEL sel1 = @selector(executeQuery:withArgumentsInArray:orDictionary:orVAList:);
Class cls = NSClassFromString(@"WBSDKFMDatabase");
NSMethodSignature *methodSignature = [cls instanceMethodSignatureForSelector:sel];
NSMethodSignature *methodSignature1 = [cls instanceMethodSignatureForSelector:sel1];
通過打斷點,查看NSMethodSignature的內(nèi)容,然后參照蘋果官方給出的
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
我這里通過打斷點NSMethodSignature 返回的是B,參看后是個bool值。

E4E32905-463A-4D72-8D1B-0E1A7708B142.png