用runtime为类添加方法
2017-08-19 本文已影响6人
5a9c6f44e578
用runtime动态的为类添加方法
先在model.m
// void的前面没有+、-号,因为只是C的代码 必须有两个指定参数(id self,SEL _cmd)
void dynamicAdd(id self, SEL _cmd) {
NSLog(@"动态添加");
}
+ (BOOL)resolveInstanceMethod:(SEL)sel;{
// 动态加载实例方法
if (sel == NSSelectorFromString(@"dynamicAdd")) {
// 第一空 给哪个类添加方法
// 第二空 添加类方法
// 第三空 方法实现,函数名 guessAnswer 意思是guessAnswer的地址指针 注意:这里需要强转成IMP类型
// 第四空 方法类型 "v@:" 意思是,v代表无返回值void,如果是i则代表int;@代表 id sel; : 代表 SEL _cmd
class_addMethod(self, sel, (IMP)dynamicAdd, "v@:");
return YES;
}
// 先恢复, 不然会覆盖系统的方法
return [super resolveInstanceMethod:sel];
}
然后在相应的页面添加方法
// model 初始化
self.object = [object new];
// performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验
// 即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用
[self.object performSelector:@selector(dynamicAdd)];