Obj-C之所以被称之为动态语言,完全是因为Runtime库,Runtime库是由C语言和汇编语言所写的,它在C语言的基础上,为Obj-C增加了面向对象的特征。同时借鉴SmallTalk增加了消息转发。说透彻了就是我们所写的所有Obj-C代码,都会通过Runtime库转换为C语言的代码。针对这么一个大家无时不刻都在使用的类库,是有必要深入了解一下的。
1.数据结构及常用名词解释
之所以开篇将一些数据的结构组成以及常用的名词解释,是为了大家在后续的过程中不会懵逼,咱们也不着急,那就一步步,踏踏实实的看。
1.Class
我们通常所说的 Class,实际上是指向 objc_class 结构体的指针,objc_class在 objc_class里定义如下:
1 | struct objc_class { |
2.Object
1 | struct objc_object { |
3.Method
1 | struct objc_method { |
4.Property
1 | // 获取指定的属性 |
2.方法调用流程

1.objc在向一个对象发送消息时,发生了什么?
Obj-C采用的是消息转发机制来实现方法的调用。
1 | // 定义了一个Person类,有一个最简单的吃东西的方法 |
我们在VC中调用这个方法
1 | Person *person = [[Person alloc] init]; |
我们根据上面的图片可以推导出:
- 1.对象会根据自己的
isa指针找到自己所属的类。 - 2.从当前类
Method_Cache中,查找对应的 SEL(方法名Hash化),如果没有再去Method_List里面找,并且放入Method_Cache中。 - 3.如果还查找不到,就到当前类的父类中查找。
- 4.向上的链条一直找不到就会报出崩溃。
但是你可能会感到很疑惑,每次调用方法都必须到自己的当前类,父类以及更上的层级去遍历岂不是很耗费时间,所以我们可以引出objc_Cache,objc_Cache会把最常用的方法存储起来,以method_name作为Key值,以method_imp作为value值进行存储,这样下一次就会优先查找objc_cache了,大大提高了效率。
1 | struct objc_cache { |
3.Runtime应用场景
1.利用 Runtime 自动归、解档
在需要归、解档的对象的.m实现文件中采用下面的方法。
本质是利用
Runtime获取实例变量列表 Ivar_list中的实例变量 ,在进行接下来的操作即可
自动归档
1 | - (instancetype)initWithCoder:(NSCoder *)aDecoder { |
自动解档
1 | - (void)encodeWithCoder:(NSCoder *)aCoder { |