美文网首页
知识点34:运行时之动态添加方法(在本类中添加)

知识点34:运行时之动态添加方法(在本类中添加)

作者: 枫之叶_小乙哥 | 来源:发表于2017-02-15 02:33 被阅读9次
    • 1.动态添加方法在本类实现,而交换方法和动态添加属性在分类中实现
    • 开发使用场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
    • 经典面试题:有没有使用performSelector,其实主要想问你有没有动态添加过方法。
    • 2.控制器中
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        // performSelector:动态添加方法
        Person *p = [[Person alloc] init];
        
        // 动态添加方法eat:, 并且传入了对象@111
    //    [p performSelector:@selector(eat)];
        [p performSelector:@selector(eat:) withObject:@111];
        
    }
    
    • 3.在Person类中
    #import "Person.h"
    
    #import <objc/message.h>
    
    @implementation Person
    
    // 定义函数(即要添加的方法)
    // 没有返回值,参数(id,SEL)
    // 方法默认至少有两个参数:id self, SEL _cmd,就是方法调用者和要添加方法名->sel
    // id param1,c语言中没有对象的概念,所以用id来代替,代表传入的@111
    void aaaa(id self, SEL _cmd, id param1)
    {
        
        NSLog(@"调用eat %@ %@ %@",self,NSStringFromSelector(_cmd),param1);
    }
    
    // 默认一个方法都有两个参数,self,_cmd,隐式参数
    // self:方法调用者
    // _cmd:调用方法的编号
    
    // 动态添加方法,首先实现这个resolveInstanceMethod
    // resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用resolveInstanceMethod
    // resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
    // sel:就是指没有实现方法
    + (BOOL)resolveInstanceMethod:(SEL)sel
    {
    //    NSLog(@"%@",NSStringFromSelector(sel));
        
        // 动态添加eat方法
        
        if (sel == @selector(eat:)) {
            
            /*
             cls:给哪个类添加方法
             SEL:添加方法的方法编号是什么(即要添加的方法的方法名)
             IMP:方法实现,函数入口,函数名(要添加方法的具体实现,用C语言)
             types:方法类型(在文档中搜索Type Encodings, class_addMethod,在表中可查对应的含义)
             */
            // @:对象 :SEL
            // 将方法入口,即指针强制转为IMP
            class_addMethod(self, sel, (IMP)aaaa, "v@:@");
            
            
            // 处理完
            return YES;
            
        }
        
        
        return [super resolveInstanceMethod:sel];
    }
    
    
    @end
    
    
    • 4.部分Type Encodings
    D8BD4D86-8C1E-4033-9A0A-64997E604087.png

    相关文章

      网友评论

          本文标题:知识点34:运行时之动态添加方法(在本类中添加)

          本文链接:https://www.haomeiwen.com/subject/tgwfwttx.html