一.Runtime是用C和汇编写的
- 对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
二.Runtime常用头文件
#import<objc/runtime.h>
#import<objc/message.h>
三.Runtime常用函数
class_copyIvarList:获得某个类内部的素有成员变量
class_copyMethodList:获得某个类内部的所有方法
class_getInstanceMethod:获得某个具体的实例方法
class_getClassMethod:获得某个具体的类方法
class_getMethodImplementation:获取方法实现
method_exchangeImplementations:交换两个方法的实现
objc_msgSend:给对象发送消息
class_addMethod:添加方法
objc_getAssociatedObject:根据关联的key,获取关联的值
objc_setAssociatedObject:设置关联属性
四.Runtime使用场景
发送消息
交换方法
动态生成属性,方法
通过block回调,直接调用action
归档,解档
字典转模型
五.Runtime各种使用场景的具体实现
1.发送消息
注意点:
2.交换方法
因为不能直接在分类中重写系统方法,例如imageNamed,这样会把系统功能覆盖掉,分类中不能调用super,所以需要用到交换方法来代替重写。
3.动态生成属性,方法
如果一个类的方法非常多,加载类到内存的时候也比较资源,需要给每个方法生成映射表,动态生成方法则解决了这个问题。
动态添加属性
4.通过block回调,直接调用action
//通过block回调,直接调用action
5.归档,解档
6.字典转模型
KVC:遍历字典中的所有key,去模型中查找有没有对应的属性名
Runtime:遍历模型中的所有属性名,去字典中查找