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