Runtime
- 数据结构
- 类对象与元类对象
- 消息传递
- 方法缓存
- 消息转发
- Method-Swizzling
- 动态添加方法
- 动态方法解析
isa指针
在32为或64位架构下,isa指针分为指针形isa和非指针形isa
指针型isa的值代表Class的地址
非指针型isa的值的部分代表Class的地址
isa指针的指向
- 关于对象,其指向类对象
- 关于类对象,其只想元类对象
- 元类对象的isa指针都指向根元类对象,而根元类对象对象的isa指针指向根类对象。
method_t
method_t结构体封装了函数四要素,即:
- 名称
- 返回值
- 参数
- 函数体
其中名称通过SEL方法选择器表示,返回值和参数则由“Type Encodings”类型的字符串表示,函数体则指代了IMP函数指针。
对象的数据结构
对象、类对象、元类对象
- 类对象存储实例方法列表等信息
- 元类对象存储类方法列表等信息
关于类对象的isa指针指向可以用下图表示:
isa指向表
消息传递机制
可以用下图展示消息传递的流程:
消息传递
注意:在消息缓存中查找是通过哈希表来快速定位函数指针,而在当前类方法列表中查找时,对于已经排序好的列表使用二分查找,而对于没有排序的列表采用一般遍历查找发。
消息转发流程
消息转发流程.jpg
我们可以在
ressolvelinstanceMethod方法中为对象动态添加方法,已达到处理消息未被实现的问题。