如果objc_msgsend(中)消息慢速查找

前言

在之前学习# IOS撸Runtime(上)我们了解到了objc_msgsend的快速查找流程, 获取class->内存偏移获取cache->获取buckets->内存偏移获取mask在高16位->异或sel得到index下标->buckets平移index*(2*16)大小找到对应bucket并且bucket--向前平移一个位置->取出相应的sel是否和消息接受者相等->如果相等走cachehit->不相等判断是否为0->为0走missLabeldaynamic->不为0循环走完->向前遍历 还没有找到走missLabeldaynamic,接下来我们就开始探索这个方法。

准备工作

objc_msgSend_uncached

CacheLookup NORMAL, _objc_msgSend, __objc_msgSend_uncached 中的第三个参数赋值给 .macro CacheLookup Mode, Function, MissLabelDynamic, MissLabelConstant. 全文搜索objc_msgSend_uncached

1.png

TailCallFunctionPointer

2.png

  • $0 = p17 但方法实现并没有操作imp的代码,猜想MethodTableLookup里面操作了imp并且赋值给p17

MethodTableLookup

3.png

  • bl:b:跳转 l:链接寄存器 在跳转到之前_lookUpImpOrForward之前

  • 将下一条指令的地址保存到lr寄存器中,既将(mov x17, x0)的指令地址保存在br中

  • _lookUpImpOrForwar执行完以后,执行br寄存器中的地址

猜你喜欢

转载自juejin.im/post/7032952171016486949