美文网首页
iOS开发拦截未实现方法的奔溃

iOS开发拦截未实现方法的奔溃

作者: Flynn_Lee | 来源:发表于2021-09-03 12:38 被阅读0次

    Runtime的消息转发机制就不班门弄斧了,有很多资料。

    我单独说一下,拦截未实现方法引起的奔溃

    以控制器为例,其他的原理类似

    1、写一个UIViewController的分类,重写-(id)forwardingTargetForSelector:(SEL)aSelector方法,

    #import "UIViewController+test.h"
    #import "testController.h"
    #import <objc/runtime.h>
    @implementation UIViewController (test)
    
    -(id)forwardingTargetForSelector:(SEL)aSelector
    {
        if (![self respondsToSelector:aSelector]) {
            return [testController new];
        }
        return [super forwardingTargetForSelector:aSelector];
    }
    

    2、写一个类专门解决这个问题

    如何创建类就不赘述了,主要是重写方法+(BOOL)resolveInstanceMethod:(SEL)sel,(resolveClassMethod与其类似,不单独写了)动态添加了一个方法,替换没有实现的。

    +(BOOL)resolveInstanceMethod:(SEL)sel
    {
        if (![self respondsToSelector:sel]) {//如果没有响应就把imp换成我们新的imp,使APP不奔溃
    
            class_addMethod(self, sel, (IMP)myMethod, "v@:");//动态添加方法
        }
        
        return YES;
    }
    
    void myMethod(id obj, SEL _cmd) {
        NSLog(@"Objective-C");
    }
    

    一般使用场景是上架后不能及时更新的app

    相关文章

      网友评论

          本文标题:iOS开发拦截未实现方法的奔溃

          本文链接:https://www.haomeiwen.com/subject/mifkwltx.html