Runtime补救措施

原文地址 :Runtime那些事儿(消息机制)

Runtime补救措施_第1张图片
8BE1EC9D-9512-45DA-9E76-41A905C8731B.png

总结:当找不到对应的IML方法时,RunTime会尝试通过用户设定的三种方法之一补救

补救一:更换/添加方法
+ (BOOL)resolveInstanceMethod:(SEL)sel

其中如果添加了函数实现则返回YES;


+ (BOOL)resolveInstanceMethod:(SEL)sel{

if (sel == @selector(doNothing)) {
    
    NSLog(@"add Method");
    class_addMethod([self class], sel, (IMP)doSomething, "v@:");
}
return [super resolveInstanceMethod:sel];
}

void doSomething(id self,SEL _cmd){
    NSLog(@"doSomething");
}
  • 关于
    OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

参数说明:
cls: 类
SEL: 方法名
IMP:函数实现
types:函数格式,"v@:",其中v就是void,带表返回类型就是空,@代表参数,这里指的是id(self),这里:指的是方法SEL(_cmd)

补救二:更换执行对象
- (id)forwardingTargetForSelector:(SEL)aSelector

例:由SecondViewController来执行这个方法

- (id)forwardingTargetForSelector:(SEL)aSelector{

    return [[SecondViewController alloc] init];
}

你可能感兴趣的:(Runtime补救措施)