二,Runtime进行动态添加方法
运用场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
实现思路:外部调用方法,如果某个类没有实现这个方法,通过+ (BOOL)resolveInstanceMethod:(SEL)sel这个方法来映射某个类的方法
某个类.m
/** 如果没有实现方法 就会默认调用这个方法 **/
+ (BOOL)resolveInstanceMethod:(SEL)sel{
if(sel == @selector(eat)){
NSLog(@"eat");
// 第一个参数:给哪个类添加方法
// 第二个参数:添加方法的方法编号
// 第三个参数:添加方法的函数实现(函数地址)
// 第四个参数:函数的类型,(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd
//class_addMethod runtime的添加方法
class_addMethod(self, @selector(eat), eat, "v@:");
}
return [super resolveInstanceMethod:sel];
}
//方法的函数实现(函数地址)
void eat(id self,SEL sel){
NSLog(@"%@ %@",self,NSStringFromSelector(sel));
NSLog(@"====%d",1+1);
}
外部调用
Person *p = [[Person alloc]init];
[p eat]; /// 或调用这个 [p performSelector:@selector(eat)];
面试时问的使用过performSelector吗 一般隐藏的意思是用过runtime动态添加方法