返回
OC底层-慢速查找揭秘
IOS
2023-11-11 12:07:08
在苹果开发的Objective-C运行时中,方法查找是一个至关重要的环节,它决定了应用程序如何响应消息传递。在先前的文章中,我们探讨了快速查找机制,它通过缓存方法信息来提升性能。然而,对于那些未被缓存的方法,OC运行时采用了慢速查找策略来查找方法实现。
慢速查找的探索
慢速查找过程主要涉及以下步骤:
1. 类方法查找:
如果目标方法是类方法,运行时将首先搜索当前类的类对象中的方法列表。如果没有找到,则继续搜索父类的类对象,依此类推,直到找到方法实现或到达根类为止。
2. 实例方法查找:
对于实例方法,查找过程从目标对象的类开始。运行时检查类的实例方法表,如果找不到方法,则继续搜索父类的实例方法表,直至找到方法实现或到达根类。
3. 元类方法查找:
对于元类方法,查找过程类似于类方法查找,但从目标对象的元类对象开始。
在慢速查找过程中,运行时需要遍历类和元类层次结构,这可能会导致性能开销,尤其是在类层次结构较深的情况下。为了优化查找速度,OC运行时采用了以下策略:
- 缓存 miss记录: 当慢速查找无法找到方法时,运行时会将这个 miss 记录缓存起来,以避免在后续调用中重复查找。
- 继承缓存: 当一个子类继承父类时,子类的类对象和元类对象会继承父类的缓存内容,从而减少了查找的范围。
慢速查找的应用场景
慢速查找主要用于以下场景:
- 未缓存的方法: 当方法未被快速查找缓存时,将使用慢速查找。
- 动态添加的方法: 通过
objc_setAssociatedObject
等 API 动态添加的方法无法被快速查找缓存,只能通过慢速查找来访问。 - 重写的方法: 子类重写父类方法时,子类的方法实现将覆盖父类的方法实现,此时需要使用慢速查找来查找重写后的方法。
优化慢速查找
虽然慢速查找相对于快速查找速度较慢,但仍可以通过以下方法进行优化:
- 减少类层次结构的深度: 扁平化的类层次结构可以减少慢速查找所需的遍历次数。
- 缓存查找结果: 将慢速查找的结果缓存起来,以避免重复查找。
- 使用高效的数据结构: OC运行时使用哈希表来存储方法信息,这可以显著提高查找速度。
总结
慢速查找是 OC 运行时方法查找机制的一个重要组成部分,用于查找未被缓存的方法实现。虽然比快速查找慢,但通过采用缓存 miss 记录和继承缓存等优化策略,可以最大程度地减少性能开销。理解慢速查找的机制对于优化 Objective-C应用程序的性能至关重要。