Runtime 动态添加方法

应用场景

如果一个类方法非常多,加载类到内存的时候比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类添加方法解决.

需求

runtime 动态添加方法处理调用一个未实现的方法 和 去除报错.

案例代码

  • 在Person.m中
#import "Person.h"
#import 
#import 

@implementation Person

void aaa(id self, SEL _cmd, NSNumber *meter) {
    
    NSLog(@"跑了%@米", meter);
    
}

+ (BOOL)resolveInstanceMethod:(SEL)sel

{
    
   // 判断run:方法的另一种方法
   // BOOL isYes = [NSStringFromSelector(sel) isEqualToString:@"run:"];
    
    if (sel == NSSelectorFromString(@"run:")) {
        
        // 动态添加run方法
        
        // class: 给哪个类添加方法
        
        // SEL: 添加哪个方法,即添加方法的方法编号
        
        // IMP: 方法实现 => 函数 => 函数入口 => 函数名(添加方法的函数实现(函数地址))
        
        // type: 方法类型,(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd
        
        /*
         比如:”v@:”意思就是这已是一个void类型的方法,没有参数传入。
         
         再比如 “i@:”就是说这是一个int类型的方法,没有参数传入。
         
         再再比如”i@:@”就是说这是一个int类型的方法,又一个参数传入。
         
         */
        
        
        class_addMethod(self, sel, (IMP)aaa, "v@:@");
        
        return YES;
        
    }
    
    return [super resolveInstanceMethod:sel];
    
}

@end

  • 调用
 //默认Person中没有实现run方法
    Person *p = [[Person alloc]init];
    
    //直接调用performSelector不会报错,运行时会崩溃
    //在runtime中添加动态方法就不会崩溃
    [p performSelector:@selector(run:) withObject:@10];
    

你可能感兴趣的:(Runtime 动态添加方法)