二,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动态添加方法

posted on 2017-11-25 17:07  廖利君  阅读(200)  评论(0编辑  收藏  举报