本篇内容涉及到oc中runtime的swizzling,方法交换的使用
这个是关于微博SDK的内部存在的一个bug。
这个bug是这样的,用户在使用App时,如果从后台进入App,会莫名的闪退Crash。而且这种情况是偶现,并不是每次都能重现出来。
从Bugly上分析,crash 报在微博的SDK上。但是微博SDK是以静态库的形式开放给我们使用,我们并不能看到它的源码和实现原理。那该怎么办呢?这有很多种方法。
- 首先肯定是向微博官方的开发者反馈问题发送邮件,因为这是官方开发者的一个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类基础上新建一个类别。
还是直接上代码看好:
关键在于获取方法的返回值是什么属性
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的内容,然后参照苹果官方给出的
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
我这里通过打断点NSMethodSignature 返回的是B,参看后是个bool值。