二十一、Runtime之(五)方法-method的方法缓存(Ca
2019-04-26 本文已影响0人
yqc5521
一、方法缓存
1.方法缓存结构关系
方法缓存结构关系
2.方法缓存代码实例
方法缓存代码实例
3.方法缓存散列表图示
@selector()作为key,imp作为value,以 @selector()&_mask作为hash表的索引。
方法缓存插入散列表过程分析:
1、如果生成的索引值在表中不存在,则直接在表中插入键值。
2、如果存在,就索引-1,继续尝试插入,直到找到空缺。
3、如果列表的容量超出范围,就进行扩容,将原来的容量*2进行加倍处理,并且清空之前的缓存,进行重新插入。
4.查找缓存方法的底层实现
查找过程:
4.1、 @selector()&_mask作为hash表的索引,如果索引对应的@selector为空或者索引对应的@selector跟作为key的@selector相同,直接返回对应的bucket。
4.2、如果索引对应的@selector跟作为key的@selector不同,就让索引-1处理。
4.2.1 cache_hash(cache_key_t key, mask_t mask)
cache_hash(cache_key_t key, mask_t mask)的实现
4.2.2 cache_next(mask_t i, mask_t mask)
在arm64架构下,会将索引-1,当为0时,将索引赋值为mask
cache_next(mask_t i, mask_t mask)的方法实现
5.方法缓存的扩容
5.1、方法缓存的扩容
方法缓存的扩容
5.2、重新分配容量
重新分配容量,释放掉旧的缓存
重新分配容量