防止客户端崩溃之如果调用了某个没有实现的类方法通过消息转发能处理吗
比如:定时器有一个类方法是iOS10以后才能用,iOS9肯定找不到这个方法,会崩溃。
参考 https://www.dazhuanlan.com/2019/12/09/5dee4ef6dca6f/ 这篇博客的方法是处理的实例方法没有的情况会防止闪退
通过网上搜索+forwardingTargetForSelector可以发现都是:要不针对实例方法的,要不类方法的有,但是要提前知道崩溃的方法名
可是我都知道哪个方法崩溃了我为什么还要用forwardingTargetForSelector我为什么不直接加上这个方法呢?
先看 NSObject.h 中的声明
可以看到只有 -forwardingTargetForSelector 的实例方法,估计绝大多数人就到这里停止了.
然后我们再去苹果的开源代码网站下载objc的源码 objc4-818.2
在这里发现了 类方法+forwardingTargetForSelector
所以,对上面参考的代码,进行简单的改造既可以实现这个目标
1.交换的时候交换类方法
{
Method originalMethod = class_getClassMethod([NSObject class], @selector(forwardingTargetForSelector:));
Method swizzledMethod = class_getClassMethod([NSObject class], @selector(my_forwardingTargetForSelector:));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
2.如图将原来的-改为+
3.将使用class_getInstanceMethod的地方改为class_getClassMethod
图中红色部分是改动的地方
这么简单为什么网上没人写呢?
为什么都想不到呢?
还是说想到了不知道怎么实现?
可见,代码的世界,一行代码不同就决定着一个功能能不能实现。