返回

iOS底层探索——cache_t结构分析(下)

IOS

iOS底层探索——cache_t结构分析(上)中,我们分析了cache_t的大小。今天,我们继续深入探索cache_t内部,了解它究竟存储了什么内容。

cache_t源码分析

源码结构概述

cache_t的源码位于objc-runtime-new.h文件中,其结构定义如下:

struct cache_t {
  ptrdiff_t    buckets;
  ptrdiff_t    mask;
  ptrdiff_t    entries;
  ptrdiff_t    wrapped;
  ptrdiff_t    size;
  ptrdiff_t    flags;
  Class*         bucketsPtr;
  IMP**         imps;
  Class*         cachedSel;
};

从结构定义中,我们可以看出cache_t主要包含以下几个部分:

  • 桶数组指针(bucketsPtr) :指向一个数组,该数组存储了散列表中的桶。
  • 方法实现指针(imps) :指向一个数组,该数组存储了散列表中桶中存储的方法实现。
  • 缓存选择器(cachedSel) :存储了当前缓存的selector。

源码分析

桶数组

桶数组是一个散列表,用于存储方法实现。每个桶都存储了一个Class指针数组,指向实现该selector的所有类的指针。

Class* bucketsPtr;

方法实现指针

方法实现指针数组存储了每个桶中方法实现的指针。

IMP** imps;

缓存选择器

缓存选择器存储了当前缓存的selector。当我们向cache_t中添加一个新的方法实现时,会更新缓存选择器为该selector。

Class* cachedSel;

cache_t中的数据

cache_t中存储的数据包括:

  • 方法实现 :存储了所有实现特定selector的类的所有方法实现。
  • 选择器 :存储了当前缓存的selector。

cache_t的工作原理

cache_t的工作原理如下:

  1. 当我们调用一个方法时,Objective-C运行时会首先在cache_t中查找该方法的实现。
  2. 如果在cache_t中找到了该方法的实现,则直接返回该实现。
  3. 如果在cache_t中没有找到该方法的实现,则Objective-C运行时会通过消息转发机制来查找该方法的实现。

总结

cache_t是一个重要的数据结构,用于存储方法实现。通过了解cache_t的结构和工作原理,我们可以更深入地理解iOS内存管理机制。