全网首发独发:如何避免因为调用了没有实现的类方法而造成APP崩溃

防止客户端崩溃之如果调用了某个没有实现的类方法通过消息转发能处理吗

比如:定时器有一个类方法是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

图中红色部分是改动的地方

这么简单为什么网上没人写呢?

为什么都想不到呢?

还是说想到了不知道怎么实现?

可见,代码的世界,一行代码不同就决定着一个功能能不能实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值