Objective-C 快速路径查找要点

objc-msg-arm64.s
第一部分 · 快速路径(缓存命中)— 从 [obj foo] 到 IMP 的最短路
一、方法调用的本质与汇编缘由
01 · 调用本质
消息发送即函数转译
[obj foo] 在编译期被改写为 objc_msgSend(obj, sel),即把方法调用转换成对运行时的一次函数派发,由 receiver 与 selector 共同决定最终执行的 IMP。
02 · 为何用汇编
极致性能与寄存器可控
每一次方法调用都会走 objc_msgSend,是绝对热点。用汇编手写可避免编译器破坏调用约定、精确控制寄存器、并实现高效的尾调用 br 跳转,把开销压到最低。
二、快速路径汇编逐段第 3 节 · objc-msg-arm64.s
布局
3.0 类对象内存布局
先确定 #CACHE#SUPERCLASS 这两个偏移量从何而来,它们是后续读取缓存与父类指针的基础。
:115
3.1 取 isa → class
通过 GetClassFromIsa_p16ISA_MASK 抹掉 isa 中的非指针位,得到真正的 class,呼应 Part 1 中的 isa 指针布局。
:336
3.2 CacheLookup
SEL 做哈希,定位到缓存中对应的 bucket,准备比对缓存里存放的 sel-imp 键值对。
:316
3.3 命中 / 未命中分支
命中(CacheHit)则直接 br IMP 跳转执行;未命中则转入慢速查找(方法列表 / 继承链)。
三、缓存查找控制流
objc_msgSend [obj foo] 取 class isa & ISA_MASK CacheLookup hash(SEL) → bucket 比对 SEL 命中 CacheHit · :316 br IMP 直接跳转执行 未命中 → 慢速查找 方法列表 / 继承链 命中 未命中
关键快速路径的全部目标,就是在缓存命中时用最少指令完成 isa → class → CacheLookup → br IMP;只有缓存落空才会付出慢速查找的代价。这正是 objc_msgSend 用汇编手写的根本动机。