iOS开发

IOSRunTime_动态添加方法

2017-04-04  本文已影响396人  _CLAY_

利用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
上一篇下一篇

猜你喜欢

热点阅读