利用runtime实现动态添加方法
2016-01-03 00:00
351 查看
开发应用场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
经典面试题:有没有使用performSelector,其实主要想问你有没有动态添加过方法。
简单实用:
方法class_addMethod的第四个参数类型,其实就是对变量类型和函数的返回类型进行字符串编码,很多朋友在看到这些编码字符串时会感到无从下手。今天从苹果文档上截了一张是变量类型编码图。
经典面试题:有没有使用performSelector,其实主要想问你有没有动态添加过方法。
简单实用:
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. Person *p = [[Person alloc] init]; // 默认person,没有实现eat方法,可以通过performSelector调用,但是会报错。 // 动态添加方法就不会报错 [p performSelector:@selector(eat)]; } @end @implementation Person // void(*)() // 默认方法都有两个隐式参数, void eat(id self,SEL sel) { NSLog(@"%@ %@",self,NSStringFromSelector(sel)); } // 当一个对象调用未实现的方法,会调用这个方法处理,并且会把对应的方法列表传过来. // 刚好可以用来判断,未实现的方法是不是我们想要动态添加的方法 + (BOOL)resolveInstanceMethod:(SEL)sel { if (sel == @selector(eat)) { // 动态添加eat方法 // 第一个参数:给哪个类添加方法 // 第二个参数:添加方法的方法编号 // 第三个参数:添加方法的函数实现(函数地址) // 第四个参数:函数的类型,(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd class_addMethod(self, @selector(eat), eat, "v@:"); } return [super resolveInstanceMethod:sel]; } @end
方法class_addMethod的第四个参数类型,其实就是对变量类型和函数的返回类型进行字符串编码,很多朋友在看到这些编码字符串时会感到无从下手。今天从苹果文档上截了一张是变量类型编码图。
相关文章推荐
- 设计模式-工厂方法模式
- 设计模式-模板方法模式
- 【嘉兴东臣php】HTML5 CSS3总结
- 无向图邻接矩阵以及深度优先遍历.(beta)
- mysql5.7 找回root密码
- vps my.cnf
- 编译 mysql5.7
- Android Tab实现总结之Viewpager
- mysql5.7 找回root密码
- vps my.cnf
- 编译 mysql5.7
- Common Lisp专题4:数组
- (一)TCP编程-线程客户端与服务端的交流
- (二)客户端与一个服务端进行聊天。线程池
- (三)服务器群发收到的信息(线程)
- URL下载数据、模拟登录或上传
- URL下载数据到其他工具类,不存到其他地方用内存流
- HttpApache下载数据
- HttpHttpApache两种上传方法
- Sax的两种解析方法