前言
在之前学习# IOS撸Runtime(上)我们了解到了objc_msgsend的快速查找流程, 获取class->内存偏移获取cache->获取buckets->内存偏移获取mask在高16位->异或sel得到index下标->buckets平移index*(2*16)大小找到对应bucket并且bucket--向前平移一个位置->取出相应的sel是否和消息接受者相等->如果相等走cachehit->不相等判断是否为0->为0走missLabeldaynamic->不为0循环走完->向前遍历
还没有找到走missLabeldaynamic
,接下来我们就开始探索这个方法。
准备工作
- objc4-818.2 源码
objc_msgSend_uncached
CacheLookup NORMAL, _objc_msgSend, __objc_msgSend_uncached
中的第三个参数赋值给 .macro CacheLookup Mode, Function, MissLabelDynamic, MissLabelConstant
. 全文搜索objc_msgSend_uncached
TailCallFunctionPointer
$0 = p17
但方法实现并没有操作imp的代码,猜想MethodTableLookup
里面操作了imp并且赋值给p17
MethodTableLookup
-
bl:b:跳转 l:链接寄存器 在跳转到之前_lookUpImpOrForward之前
-
将下一条指令的地址保存到lr寄存器中,既将(mov x17, x0)的指令地址保存在br中
-
当
_lookUpImpOrForwar
执行完以后,执行br寄存器中的地址