返回
cache_t 分析:iOS 底层的缓存探索
见解分享
2024-01-17 02:31:35
iOS 开发中,每个类都有一个内部结构体 objc_class
,其中包含了类的信息和元数据。本文深入分析 objc_class
中的 cache_t
结构体,揭示其在 iOS 底层缓存机制中的作用。
cache_t
是一个 C 结构体,位于 objc_class
中,用于存储与类方法相关的元数据。它包含几个段:
- _selBucket :一个哈希表,用于快速查找方法选择器。
- _methodList :一个双向链表,指向该类中所有方法的
Method
结构体。 - _class :指向该
cache_t
所属类的objc_class
指针。 - _msak :方法签名和实现键(MSAK)的哈希值,用于唯一标识方法。
- _occupied :哈希表中已用插槽的数量。
当调用一个类方法时,系统会查找 objc_class
中的 cache_t
。_selBucket
哈希表用于根据方法选择器快速查找方法。如果找到匹配项,系统将直接返回该方法的 Method
结构体。
如果没有找到匹配项,系统将搜索 _methodList
链表以查找方法。如果找到匹配项,系统将更新 _selBucket
哈希表并返回 Method
结构体。
第一次调用一个方法时,系统会创建一个 cache_t
结构体并将其添加到 objc_class
中。然后,它会将方法选择器添加到 _selBucket
哈希表,并将方法的 Method
结构体添加到 _methodList
链表。
使用 cache_t
提供了几个好处:
- 快速方法查找:
_selBucket
哈希表允许快速查找方法选择器。 - 内存优化: 缓存存储了所有方法的元数据,从而避免了多次查找方法所需的额外内存开销。
- 可扩展性:
cache_t
结构灵活,可以适应新方法的添加和删除。
动态添加方法时,系统会更新 objc_class
中的 cache_t
。它会将新方法选择器添加到 _selBucket
哈希表,并将方法的 Method
结构体添加到 _methodList
链表。
对于最佳实践,建议:
- 避免使用动态添加方法,因为它会影响性能。
- 适当清理不再使用的缓存,以释放内存。
- 使用代码生成工具,如
interface_builder
,来预先生成方法缓存。