原文地址 :Runtime那些事儿(消息机制)
总结:当找不到对应的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];
}