1. 什么是运行时? <objc/message.h>/ <objc/runtime>
1>运行时是一套纯 C 语言的 API(纯 C 语言库)
2>*编译器最终都会将 OC 代码转化为运行时代码.
*clang -rewrite-objc xxx.m编译器指令验证编译器将 OC代码转换成运行时代码
3>利用运行时, 可以做很多底层的操作, 比如
*动态添加成员变量和方法
*动态交换两个方法的实现
*获得某个类的所有成员方法, 所有成员变量
例: 动态交换方法:
2. 如何应用运行时
1> 将某些 OC 代码转为运行时, 探究底层. 比如 block 的实现原理
2> 拦截系统自带的方法调用, 比如拦截 imageNamed:, viewDidLoad, alloc
3> 实现字典和模型的自动转换
4> 实现分类也可以增加属性
5>实现 NSCoding 属性的自动归档和自动解档
分类中不允许添加类扩展
优化:char NameKey;
*获取所有成员变量
如果属性太多, 这样存储属性, 太麻烦.
3运行时常用的函数
1><objc/runtime.h>
Method class_getClassMethod(Class cls, SEL name)
获得某个类的类方法
Method class_getInstanceMethod(Method m1, SEL name)
获得某个对象的对象法
//交换两个方法的实现
void method_exchangeImplemtantions(Method m1, Method m2)
2><objc/message.h>
* void objc_msgSend(void)
给某个对象发送消息