运行时浅析

1. 什么是运行时? <objc/message.h>/ <objc/runtime>

1>运行时是一套纯 C 语言的 API(纯 C 语言库)
2>*编译器最终都会将 OC 代码转化为运行时代码. 
*clang -rewrite-objc xxx.m编译器指令验证编译器将 OC代码转换成运行时代码
3>利用运行时, 可以做很多底层的操作, 比如
*动态添加成员变量和方法
 *动态交换两个方法的实现
 *获得某个类的所有成员方法, 所有成员变量

例: 动态交换方法:


a.png
b.png
c.png

2. 如何应用运行时

1> 将某些 OC 代码转为运行时, 探究底层. 比如 block 的实现原理
2> 拦截系统自带的方法调用, 比如拦截 imageNamed:, viewDidLoad, alloc
3> 实现字典和模型的自动转换
4> 实现分类也可以增加属性
5>实现 NSCoding 属性的自动归档和自动解档

d.png

分类中不允许添加类扩展

e.png

优化:char NameKey;

g.png
11.png

*获取所有成员变量


12.png
23.png

如果属性太多, 这样存储属性, 太麻烦.

运行时保存属性.png
或许成员变量的值.png

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)
给某个对象发送消息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容