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

2021-09-03  本文已影响0人  Flynn_Lee

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

上一篇下一篇

猜你喜欢

热点阅读