返回
iOS 底层原理 11:objc_class 中缓存原理分析
IOS
2023-12-31 20:59:27
前言
在 iOS 底层原理 07:isa 与类关联的原理和 iOS 底层原理 08:类 & 类结构分析中,我们深入剖析了 objc_class 中 isa 和类结构的奥秘。而本次的 iOS 底层原理 11 将带我们探索 objc_class 中的另一重要机制——缓存,揭开 sel-imp 缓存的原理面纱。
cache_t 结构
在 objc_class 结构体中,cache_t 是一个至关重要的成员,负责缓存 sel-imp 映射关系。它的定义如下:
struct cache_t {
IMP imp;
SEL sel;
};
cache_t 结构体包含两个成员变量:imp 和 sel。imp 是指向方法实现(implementation)的函数指针,而 sel 则是指向方法选择器(selector)的指针。
sel-imp 缓存原理
objc_class 中的缓存机制旨在优化方法调用的性能。当调用一个方法时,objc_msgSend 会首先检查缓存中是否已经存在该方法的 sel-imp 映射关系。如果存在,则直接返回缓存中的 imp,避免了耗时的方法查找过程。
如果缓存中不存在该方法的 sel-imp 映射关系,则需要进行方法查找,依次查找父类、父类的父类,直到找到该方法的实现为止。找到方法实现后,将其添加到缓存中,供后续调用使用。
缓存的优点
缓存机制为 iOS 底层带来了以下优点:
- 提高方法调用性能: 通过缓存 sel-imp 映射关系,避免了耗时的方法查找过程,从而大幅提高方法调用的性能。
- 减少内存占用: 由于缓存仅存储常用的 sel-imp 映射关系,因此可以减少内存占用,避免不必要的内存开销。
- 提高代码的可读性: 缓存机制使得代码更加清晰易懂,方法查找的逻辑与方法调用的逻辑分离,便于理解和维护。
缓存的缺点
尽管缓存机制带来了诸多优点,但也存在一些缺点:
- 缓存不一致性: 当类方法发生动态修改时(如通过 method_setImplementation),缓存可能与实际的方法实现不一致,导致错误的结果。
- 缓存空间有限: 缓存的大小有限,如果缓存的 sel-imp 映射关系过多,可能会导致缓存溢出,降低性能。
总结
objc_class 中的缓存机制是 iOS 底层的重要优化手段,它通过缓存 sel-imp 映射关系,极大地提高了方法调用的性能。然而,缓存机制也存在一些缺点,需要在实际应用中谨慎考虑。