返回

快速理解 ObjC消息发送查找流程

IOS

概述
在 Objective-C 中,消息发送是通过 objc_msgSend 方法实现的。objc_msgSend 方法的查找流程分为快速查找和慢速查找两部分。快速查找流程主要通过方法缓存来提高查找速度,而慢速查找流程则通过遍历类的继承体系来查找方法。

快速查找流程

快速查找流程主要通过方法缓存来提高查找速度。方法缓存是一个存储着最近使用过的消息发送信息的哈希表。当 objc_msgSend 方法被调用时,它首先会检查方法缓存中是否有该消息发送的信息。如果有,则直接从方法缓存中获取方法信息并进行调用。否则,则跳到慢速查找流程。

快速查找流程的步骤如下:

  1. 检查方法缓存中是否有该消息发送的信息。
  2. 如果有,则直接从方法缓存中获取方法信息并进行调用。
  3. 如果没有,则跳到慢速查找流程。

慢速查找流程

慢速查找流程主要通过遍历类的继承体系来查找方法。当 objc_msgSend 方法被调用时,它首先会从当前类的类方法表中查找该消息发送的方法信息。如果找到,则直接进行调用。否则,则继续从当前类的父类的类方法表中查找。以此类推,直到找到该消息发送的方法信息为止。

慢速查找流程的步骤如下:

  1. 从当前类的类方法表中查找该消息发送的方法信息。
  2. 如果找到,则直接进行调用。
  3. 如果没有,则继续从当前类的父类的类方法表中查找。
  4. 以此类推,直到找到该消息发送的方法信息为止。

查找流程的优化

为了提高 objc_msgSend 方法的查找速度,编译器会对消息发送进行优化。这些优化措施包括:

  • 内联展开 :编译器会将一些简单的方法调用内联展开,从而避免调用 objc_msgSend 方法的开销。
  • 方法缓存 :编译器会将最近使用过的消息发送信息存储在方法缓存中,以便下次调用时可以快速查找。
  • 继承体系优化 :编译器会对类的继承体系进行优化,以便减少 objc_msgSend 方法在遍历继承体系时所需要的时间。

慢速查找流程示例

@interface MyClass : NSObject

- (void)method1;
- (void)method2;

@end

@implementation MyClass

- (void)method1 {
  NSLog(@"This is method1.");
}

- (void)method2 {
  NSLog(@"This is method2.");
}

@end

int main() {
  MyClass *object = [[MyClass alloc] init];
  [object method1];  // Fast lookup
  [object method2];  // Slow lookup
  return 0;
}

在上面的示例中,[object method1] 的查找速度会很快,因为该方法已被存储在方法缓存中。而 [object method2] 的查找速度会很慢,因为该方法尚未被存储在方法缓存中,需要遍历类的继承体系才能找到。

总结

本文介绍了 ObjC 消息发送查找流程,包括快速查找和慢速查找两部分。文章详细讲解了查找流程的原理和步骤,并提供了相应的示例代码,帮助读者快速理解 ObjC 消息发送查找流程。