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 { |