返回

iOS真机下的消息快速查找优化(下)

IOS

汇编指令分析

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应用程序的性能至关重要。