iOS-解决调用未实现方法程序Crash的问题

iOS在调用未实现的方法时会造成程序Crash的问题,其实在Crash之前程序会查看改类有没有实现如下两个方法,如果实现了两方法就会先调用下面的两个方法

//调用实例方法没有找到会走这个方法
+ (BOOL)resolveClassMethod:(SEL)sel
//调用类方法没有找到会走这个方法
+ (BOOL)resolveInstanceMethod:(SEL)sel

那么为避免程序Crash,可以实现上面两个方法,然后通过runtime动态为该类添加实现,返回YES表示已处理,NO表示为处理,在没有添加实现时,直接返回YES也是会Crash的,具体实现如下:

void dynamicMethodIMP(id self, SEL _cmd) {
    NSLog(@" >> 动态实现");
}
+ (BOOL)resolveInstanceMethod:(SEL)sel{
   
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
    IMP imp =  dynamicMethodIMP;
#pragma clang diagnostic pop

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
    if (sel == @selector(wode)) {
        NSLog(@"resolveInstanceMethod-sel==%@",NSStringFromSelector(sel));

//        class_addMethod(Class  _Nullable __unsafe_unretained cls, SEL  _Nonnull name, IMP  _Nonnull imp, const char * _Nullable types)
        //最后表示这个c函数的返回以及各个参数类型,具体意义查看
        //https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100
        class_addMethod(self, @selector(wode), imp, "v@:");
        return YES;
    }
#pragma clang diagnostic pop
    return [super resolveInstanceMethod:sel];
}
+ (BOOL)resolveClassMethod:(SEL)sel{
    return [super resolveClassMethod:sel];
}

注意

class_addMethod()方法只能添加实例方法,无法添加类方法详细见官方文档如下:
官方文档

types参数说明.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,800评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,793评论 1 32
  • 生忽略死 死蔑视生 生死不共戴天 生奔向死 死等待生 生死狭路相逢 死生契阔,与子成说 这世间 从不缺说梦的痴人
    寐耳阅读 1,527评论 0 2
  • 枯叶 丹心 文/兰兰 叶飘过 心来到这里 忽然间 看到你在落泪 风吹起 叶叶憔悴 心伤悲 像茧束缚着自己 我不知...
    兰如纯阅读 3,746评论 0 0
  • 转自://www.greatytc.com/p/q81RER 之前写了好多内容,居然好多功能都不会用,尴...
    菜鸟平阅读 1,644评论 0 0