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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容