相比“凌波微步”的swift,Object-C被誉为“如来神掌”。传说Runtime就是支持这“如来神掌”说法的最好体现。听起来总是这么的神秘高级,于是总能在各个论坛看到碎片资料,时间一长总记不住哪里是哪里,每次都要打开好几个网页。这种记不住象现显然是知识体系还不完整重要体现。还是自己从Runtime的思想到动手代码呈现上做出总结尚为上策。
一.基本概念
- RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
- 对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
- OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。
- 只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。
官网文档还提供关于传统和现代版本Runtime的说明
- In the legacy runtime, if you change the layout of instance variables in a class, you must recompile classes that inherit from it.
- In the modern runtime, if you change the layout of instance variables in a class, you do not have to recompile classes that inherit from it.
In addition, the modern runtime supports instance variable synthesis for declared properties (see Declared Properties in The Objective-C Programming Language).
二.知晓OC的方法调用在Runtime中具体的实现
1.OC代码调用一个方法
1 |
[self.loginBt login]; |
2.在编译时RunTime会将上述代码转化成[发送消息]
1 |
objc_msgSend(self.loginB,@selector(login)); |
三.常见的作用
既然是“如来神掌”,简直可以无法无天啦,当街拦下一个人问道“这是马还是鹿啊?”,那人看是Runtime大人惧怕道“Runtime大人,您说是马就是马,是鹿就是鹿~”。Runtime大快“wow哈哈哈~,见你乖巧,我也不为难于你。你缺头驴是吧?,本大人现在造一头送于你,迁回家便是!喔~哈哈哈”。
呵呵,扯远了,回到Runtime作用上。无所不能的事情就不一一介绍了,梳理下较为可能用的几个地方:
1. 动态的添加对象的成员变量和方法
2. 动态交换两个方法的实现
3. 实现分类也可以添加属性
4. 实现NSCoding的自动归档和解档
5. 实现字典转模型的自动转换
四.编写代码实现
1. 动态变量控制
1)Sense:
1 2 3 4 |
Teacher: What's your name? XiaoMing: My name is XiaoMing. Teacher: Pardon? XiaoMing: My name is __ |
在程序当中,假设XiaoMing的name原来的值为XiaoMing,后来被Runtime偷换了一个名字叫Minggo。那么,Runtime是如何做到的呢?
2)Step:
①动态获取XiaoMing类中的所有属性[当然包括私有]
1 |
Ivar *ivar = class_copyIvarList([self.xiaoMing class], &count); |
②遍历属性找到对应name字段
1 |
const char *varName = ivar_getName(var); |
③修改对应的字段值成Minggo
1 |
object_setIvar(self.xiaoMing, var, @"Minggo"); |
3)Show Code:
1 2 3 4 |
-(void)answer{ unsigned int count = 0; Ivar *ivar = class_copyIvarList([self.xiaoMing class], &count); for (int i = 0; i |
2. 动态交换方法
1)Sense:
1 2 3 4 |
Teacher: What's your name? XiaoMing: My name is XiaoMing. Teacher: Pardon? XiaoMing: My name is __ |
在程序当中,假设XiaoMing的第一次回答为firstSay,后来被Runtime交换了一个名字叫secondSay的方法,最终再调用firstSay的时候,其实是调用了secondSay的实现。那么,Runtime是如何做到的呢?
2)Step:
①动态找到firstSay和secondSay方法
1 2 |
Method m1 = class_getInstanceMethod([self.xiaoMing class整重要体现。还是自己从Runtime的思想到动手代码呈现上做出总结尚为上策。
一.基本概念
官网文档还提供关于传统和现代版本Runtime的说明
二.知晓OC的方法调用在Runtime中具体的实现1.OC代码调用一个方法
2.在编译时RunTime会将上述代码转化成[发送消息]
三.常见的作用
呵呵,扯远了,回到Runtime作用上。无所不能的事情就不一一介绍了,梳理下较为可能用的几个地方: 1. 动态的添加对象的成员变量和方法 四.编写代码实现1. 动态变量控制1)Sense:
在程序当中,假设XiaoMing的name原来的值为XiaoMing,后来被Runtime偷换了一个名字叫Minggo。那么,Runtime是如何做到的呢? 2)Step:①动态获取XiaoMing类中的所有属性[当然包括私有]
②遍历属性找到对应name字段
③修改对应的字段值成Minggo
3)Show Code:
2. 动态交换方法1)Sense:
在程序当中,假设XiaoMing的第一次回答为firstSay,后来被Runtime交换了一个名字叫secondSay的方法,最终再调用firstSay的时候,其实是调用了secondSay的实现。那么,Runtime是如何做到的呢? 2)Step:①动态找到firstSay和secondSay方法
|