返回

透析iOS消息查找流程,快速与慢速相结合构建精准查找

IOS







## iOS消息查找流程综述

iOS消息查找流程是iOS操作系统中的一项关键机制,用于在运行时动态查找和执行Objective-C对象的消息。该流程分为快速查找和慢速查找两个部分,以实现高效和准确的消息查找。

* **快速查找** :在快速查找中,系统首先通过对象的类指针和消息选择器(SEL)在对象的类缓存中查找消息实现。如果在类缓存中找到消息实现,则直接执行该实现。
* **慢速查找** :如果快速查找中未找到消息实现,则进入慢速查找。在慢速查找中,系统将通过对象的类层次结构逐级查找消息实现,直到找到该消息的实现或到达根类为止。

## 快速查找与慢速查找的差异

快速查找和慢速查找的主要区别在于查找速度和查找范围。快速查找速度更快,但查找范围仅限于对象的类缓存。慢速查找速度较慢,但查找范围更广,涵盖了整个对象的类层次结构。

快速查找的优势在于速度快,能够在常数时间内完成消息查找。这使得快速查找成为iOS消息查找流程中至关重要的部分。然而,快速查找也存在一些局限性。首先,快速查找仅限于在对象的类缓存中查找消息实现。其次,快速查找可能会受到类缓存命中率的影响。如果类缓存的命中率较低,则快速查找的性能将会下降。

慢速查找的优势在于查找范围更广,能够在整个对象的类层次结构中查找消息实现。这使得慢速查找能够找到快速查找无法找到的消息实现。然而,慢速查找也存在一些局限性。首先,慢速查找的速度较慢,因为需要逐级遍历对象的类层次结构。其次,慢速查找可能会受到继承层次结构的深度和复杂度的影响。如果继承层次结构较深或较复杂,则慢速查找的性能将会下降。

## 消息查找流程中的关键元素

### objc_msgSend

objc_msgSend是Objective-C语言中发送消息的底层方法。在消息查找流程中,objc_msgSend首先会尝试快速查找消息实现。如果在类缓存中找到消息实现,则直接执行该实现。如果在类缓存中未找到消息实现,则objc_msgSend会进入慢速查找。在慢速查找中,objc_msgSend会通过对象的类层次结构逐级查找消息实现,直到找到该消息的实现或到达根类为止。

### __class_lookupMethodAndLoadCache3

__class_lookupMethodAndLoadCache3是Objective-C运行时库中的一个方法,用于在对象的类缓存中查找消息实现。在消息查找流程中,objc_msgSend首先会调用__class_lookupMethodAndLoadCache3来查找消息实现。如果__class_lookupMethodAndLoadCache3在类缓存中找到消息实现,则objc_msgSend直接执行该实现。如果__class_lookupMethodAndLoadCache3在类缓存中未找到消息实现,则objc_msgSend进入慢速查找。

### SEL

SEL是消息选择器,用于标识要发送的消息。在消息查找流程中,objc_msgSend使用SEL来在对象的类缓存或类层次结构中查找消息实现。SEL是一个指向消息名称的指针,由编译器生成。

### 消息转发

消息转发是Objective-C语言中的一种机制,允许对象将未实现的消息转发给其他对象处理。在消息查找流程中,如果在快速查找和慢速查找中都未找到消息实现,则对象会尝试将消息转发给其他对象。消息转发可以通过多种方式实现,例如,通过继承、代理或消息转发协议。

## 总结

iOS消息查找流程是苹果操作系统中的一项关键机制,用于在运行时动态查找和执行Objective-C对象的消息。该流程分为快速查找和慢速查找两个部分,以实现高效和准确的消息查找。快速查找速度更快,但查找范围仅限于对象的类缓存。慢速查找速度较慢,但查找范围更广,涵盖了整个对象的类层次结构。消息查找流程中的关键元素包括objc_msgSend、__class_lookupMethodAndLoadCache3、SEL和消息转发。通过对这些元素的理解,开发者将能够更深入地掌握iOS消息查找机制,并编写出更有效、更稳定的Objective-C程序。