美文网首页
二十一、Runtime之(五)方法-method的方法缓存(Ca

二十一、Runtime之(五)方法-method的方法缓存(Ca

作者: yqc5521 | 来源:发表于2019-04-26 09:44 被阅读0次

    一、方法缓存

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


    重新分配容量

    相关文章

      网友评论

          本文标题:二十一、Runtime之(五)方法-method的方法缓存(Ca

          本文链接:https://www.haomeiwen.com/subject/ftpegqtx.html