返回
iOS底层探索——cache_t结构分析(下)
IOS
2023-11-17 10:41:26
在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的工作原理如下:
- 当我们调用一个方法时,Objective-C运行时会首先在cache_t中查找该方法的实现。
- 如果在cache_t中找到了该方法的实现,则直接返回该实现。
- 如果在cache_t中没有找到该方法的实现,则Objective-C运行时会通过消息转发机制来查找该方法的实现。
总结
cache_t是一个重要的数据结构,用于存储方法实现。通过了解cache_t的结构和工作原理,我们可以更深入地理解iOS内存管理机制。