返回
如何找到你的道路:慢速查找流程中的 __objc_msgSend_uncached
IOS
2023-11-09 02:04:55
从慢速消息查找流程到objc_msgSend_uncached
前言
本文旨在探索 Objective-C 消息查找流程中的慢速查找流程,具体关注 __objc_msgSend_uncached 函数。我们将探讨该函数在消息传递机制中的作用,为何存在慢速查找流程,以及为何不完全使用快速查找。
消息查找的分类
在 Objective-C 中,消息查找根据所使用的缓存策略分为两种类型:快速查找和慢速查找。
- 快速查找: 使用缓存的查找,该缓存将选择器(消息名称)映射到要调用的方法实现。这是一种高效的方法,因为它避免了在每次消息发送时都搜索类层次结构。
- 慢速查找: 不使用缓存的查找,它在每次消息发送时都会搜索类层次结构以找到要调用的方法实现。这是一种较慢的方法,但它更灵活,因为它允许在运行时动态添加和删除类和方法。
__objc_msgSend_uncached 函数
__objc_msgSend_uncached 函数负责执行慢速查找流程。它直接在类层次结构中搜索要调用的方法实现,绕过快速查找缓存。
为何存在慢速查找流程
慢速查找流程存在以下原因:
- 动态加载类: Objective-C 允许在运行时动态加载类。这使得 __objc_msgSend_uncached 函数可以在类首次加载时更新缓存,从而确保正确的方法实现被调用。
- 方法覆盖: 派生类可以覆盖基类中的方法。在快速查找缓存中,只有基类方法的实现被缓存。使用 __objc_msgSend_uncached 可以找到派生类中已覆盖的方法实现。
- 消息转发: 对象可以通过消息转发机制处理未定义的消息。__objc_msgSend_uncached 允许消息转发,而快速查找缓存则不会。
为何不完全使用快速查找
虽然快速查找更有效,但它也有一定的局限性:
- 缓存大小: 快速查找缓存的容量是有限的,可能会导致缓存溢出和性能下降。
- 缓存无效: 当类层次结构或方法实现发生变化时,快速查找缓存可能无效。这可能导致调用错误的方法实现。
因此,慢速查找流程对于 Objective-C 消息传递机制的灵活性至关重要。它允许在运行时动态更改,并处理动态加载类和方法覆盖等情况。
结论
慢速消息查找流程,由 __objc_msgSend_uncached 函数负责,是 Objective-C 消息传递机制中一个重要的方面。它提供了一种灵活的方法来处理动态加载类、方法覆盖和消息转发,即使代价是牺牲了性能。