美文网首页iOS开发
IOSRunTime_动态添加方法

IOSRunTime_动态添加方法

作者: _CLAY_ | 来源:发表于2017-04-04 12:59 被阅读396次

    利用RunTime运行时,动态添加一个方法

    动态添加方法,首先实现这个resolveInstanceMethod

    resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用resolveInstanceMethod
    resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
    sel:没有实现方法

    ViewController.m

    #import "ViewController.h"
    #import "Person.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        Person *p = [[Person alloc] init];
        [p performSelector:@selector(eat)];
        [p performSelector:@selector(play:) withObject:@"王者荣耀"];
    }
    @end
    

    Person.m

    #import "Person.h"
    #import <objc/message.h>
    @implementation Person
    //当一个类没有实现类方法的时候会到以下代码中
    //+ (BOOL)resolveClassMethod:(SEL)sel {
    //}
    
    
    //当一个类没有实现对象方法的时候会到以下代码中
    + (BOOL)resolveInstanceMethod:(SEL)sel {
        NSLog(@"--%@",NSStringFromSelector(sel));
        if (sel == @selector(eat)) {
            /**
             @param class 类类型
             @param name 方法编码
             @param IMP 方法实现,就是一个函数指针
             @param type 返回值和参数
             */
            class_addMethod([Person class], sel, (IMP)eat, "v@:");
        } else if (sel == @selector(play:)) {
            class_addMethod([Person class], sel, (IMP)play, "v@:@ ");
        }
        return [super resolveClassMethod:sel];
    }
    
    void eat(id self , SEL _cmd) {
        NSLog(@"调用了%@的%@方法",self,NSStringFromSelector(_cmd));
    }
    
    void play(id self, SEL _cmd, id objc) {
        NSLog(@"调用了%@的%@方法 PLay%@",self,NSStringFromSelector(_cmd),objc);
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:IOSRunTime_动态添加方法

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