Runtime|Runtime 动态添加方法
应用场景
如果一个类方法非常多,加载类到内存的时候比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类添加方法解决.
需求
【Runtime|Runtime 动态添加方法】runtime 动态添加方法处理调用一个未实现的方法 和 去除报错.
案例代码
- 在Person.m中
#import "Person.h"
#import
#import @implementation Personvoid 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];
推荐阅读
- 编写字典程序
- 动态组件与v-once指令
- 怎么将桌面上的CAD图纸添加到软件中进行BMP格式转换()
- iview|iview upload 动态改变上传参数
- iOS|iOS runtime应用整理
- react-navigation|react-navigation 动态修改 tabBar 样式
- 2147483647与int型
- K14|K14 9/15销售提问法D2
- 怎样把一个字典的数据添加到另一个字典中()
- 动态|诗歌《在精神科诊室》发《小说与诗》(香港)报