rutime动态添加方法
2016-06-06 本文已影响38人
cj小牛
import "ViewController.h"
import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [[Person alloc]init];
// performSelector 动态添加方法
// [p performSelector:@selector(eat)];
[p performSelector:@selector(eat:) withObject:@111];
}
@end
import "Person.h"
import <objc/message.h>
@implementation Person
// 定义一个函数 这个就是动态添加的方法
void aaa(id self, SEL _cmd ,id param){
NSLog(@"这个就是eat方法%@",param);
}
void dynamicMethodIMP(id self, SEL _cmd) {
// 默认的方法有2个参数 self :方法调用者
// ——cmd 调用参数的编号 这两个参数是隐新参数
}
// 动态天假方法首先要实现reslveinstancemethod
// resloveInstanceMethod 调用 :当一个方法没有实现但是又吊用了这个方法就会调用 resolveInstanceMethod
// resloveInstanceMethod 作用:就知道了哪些方法没有实现就可以动态的添加方法
// sel:没有实现的方法
+(BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@"%@",NSStringFromSelector(sel));
if(sel == @selector(eat:)){
// 参数: clas 给哪个类添加方法 sel :添加方法的编号 imp 方法的实现(函数的入口,函数的指针 函数名) types 方法的类型
这里的参数v代表void ,@代表 对象 :代表sel @代表 Id
class_addMethod(self, sel, (IMP)aaa, "v@:@");
return YES;
}
return [super resolveInstanceMethod:sel];
}