返回

cache_t 分析:iOS 底层的缓存探索

见解分享

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,来预先生成方法缓存。