二十一、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、重新分配容量
重新分配容量,释放掉旧的缓存


重新分配容量
上一篇下一篇

猜你喜欢

热点阅读