[iOS底层]-objc_msgSend快速查找原理
[iOS底层]-objc_msgSend快速查找原理
方法是如何读取的?
在[iOS底层]-cache_t分析一文里,我们知道了方法是如何缓存起来的,缓存的目的是为了加快方法的查找速度,那么我们在调用方法的时候是如何去读取这些缓存的呢?
下载本次分析用的demo,把main.m
编译成main.cpp
文件,找到main函数的实现。
int main(int argc, const char * argv[]) { |
- 可以看到,方法的调用在底层被解析成
objc_msgSend
方法。 objc_msgSend
方法有两个参数,第一个参数为消息接收者,第二个参数是SEL
。
objc_msgSend流程分析
确定了objc_msgSend
是我们的重点研究对象后,打开demo,全局查找一下,可以在objc-msg-arm64.s
中找到_objc_msgSend
的汇编实现,是的,_objc_msgSend
是一个汇编方法。汇编指令可以参考这篇文章汇编指令查询。
ENTRY _objc_msgSend // ENTRY 标识_objc_msgSend入口 |
CacheLookup流程
.macro CacheLookup |
objc_msgSend查找整体流程如下

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雷军的博客!