返回
iOS真机下的消息快速查找优化(下)
IOS
2023-12-29 18:38:16
汇编指令分析
objc_msgSend流程
通过真机汇编分析,我们可以得到objc_msgSend的执行流程简化图:
objc_msgSend -> mov r3, r5 -> mov r2, #selector(sel) -> bl objc_msgSendSuper
其中:
mov r3, r5
:将接收者对象指针(self
)赋值给寄存器r3
。mov r2, #selector(sel)
:将选择器(sel
)赋值给寄存器r2
。bl objc_msgSendSuper
:调用objc_msgSendSuper
函数。
cache_t内存扩容
在真机模式下,当cache_t
结构体内存不足时,系统会自动进行内存扩容。具体扩容过程如下:
- 真机模式下,
cache_t
结构体分配在堆区。 - 当
cache_t
结构体中的条目数达到一定阈值时,系统会触发内存扩容。 - 内存扩容后,
cache_t
结构体的地址会发生变化。 - 调用
objc_msgSend
时,系统会根据新的cache_t
结构体地址进行消息查找。
模拟器与真机模式差异
在模拟器模式下,cache_t
结构体分配在栈区,因此不会触发内存扩容。而在真机模式下,cache_t
结构体分配在堆区,当条目数达到一定阈值时会触发内存扩容。
这种差异会导致以下问题:
- 模拟器模式下,
cache_t
结构体的地址不会改变。 - 真机模式下,
cache_t
结构体的地址会发生变化。 - 调用
objc_msgSend
时,模拟器模式和真机模式会使用不同的cache_t
结构体地址进行消息查找。
真机汇编分解图解
下面通过真机汇编分解图解来展示消息快速查找的优化过程:
; 真机汇编
mov x0, #selector(sayHello:)
mov x1, #0
mov x2, #0
bl objc_msgSend
; 优化后真机汇编
ldr x0, [pc, #cache_t_offset]
ldr x1, [pc, #sel_offset]
ldr x2, [x0, x1, lsl #3]
br x2, call_method
其中:
cache_t_offset
:指向cache_t
结构体的偏移地址。sel_offset
:指向选择器的偏移地址。call_method
:调用方法的地址。
优化后的汇编指令直接从cache_t
结构体中获取方法地址,省去了objc_msgSend
函数的调用,从而提高了消息查找的速度。
总结
通过深入分析真机汇编指令,我们可以了解到objc_msgSend的执行流程、cache_t内存扩容的差异,以及消息快速查找的优化过程。这些知识对于理解和优化iOS应用程序的性能至关重要。