返回
快速理解 ObjC消息发送查找流程
IOS
2023-10-01 14:24:44
概述
在 Objective-C 中,消息发送是通过 objc_msgSend
方法实现的。objc_msgSend
方法的查找流程分为快速查找和慢速查找两部分。快速查找流程主要通过方法缓存来提高查找速度,而慢速查找流程则通过遍历类的继承体系来查找方法。
快速查找流程
快速查找流程主要通过方法缓存来提高查找速度。方法缓存是一个存储着最近使用过的消息发送信息的哈希表。当 objc_msgSend
方法被调用时,它首先会检查方法缓存中是否有该消息发送的信息。如果有,则直接从方法缓存中获取方法信息并进行调用。否则,则跳到慢速查找流程。
快速查找流程的步骤如下:
- 检查方法缓存中是否有该消息发送的信息。
- 如果有,则直接从方法缓存中获取方法信息并进行调用。
- 如果没有,则跳到慢速查找流程。
慢速查找流程
慢速查找流程主要通过遍历类的继承体系来查找方法。当 objc_msgSend
方法被调用时,它首先会从当前类的类方法表中查找该消息发送的方法信息。如果找到,则直接进行调用。否则,则继续从当前类的父类的类方法表中查找。以此类推,直到找到该消息发送的方法信息为止。
慢速查找流程的步骤如下:
- 从当前类的类方法表中查找该消息发送的方法信息。
- 如果找到,则直接进行调用。
- 如果没有,则继续从当前类的父类的类方法表中查找。
- 以此类推,直到找到该消息发送的方法信息为止。
查找流程的优化
为了提高 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 消息发送查找流程。