利用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
网友评论