美文网首页
Runtime 的方法缓存?存储的形式、数据结构以及查找的过程?

Runtime 的方法缓存?存储的形式、数据结构以及查找的过程?

作者: 牛奶红茶 | 来源:发表于2021-03-16 14:05 被阅读0次

    cache_t增量扩展的哈希表结构,哈希表内部存储的bucket_t

    bucket_t中存储的是SEL和IMP的健值对

    如果是有序的方法列表,采用二分查找,如果过是无序的方法列表,直接遍历查找

    cache_t结构体

    // 缓存曾经调用过的方法,提高查找速率
    struct cache_t {
        struct bucket_t *_buckets; // 散列表
        mask_t _mask; //散列表的长度 - 1
        mask_t _occupied; // 已经缓存的方法数量,散列表的长度使大于已经缓存的数量的。
        //...
    }

    struct bucket_t {
        cache_key_t _key; //SEL作为Key @selector()
        IMP _imp; // 函数的内存地址
        //...
    }

    三列表的查找过程,在objc-cache.mm文件中

    查询散列表过程

    其中cache_hash(k,m)是静态内联方法,将传入key和mask进行&操作返回uint32_t索引值,do-while循环查找过程过,当发生冲突cache_next方法将索引值减1,如果索引值一直循环减下去,直到等于最开始的索引,则代表缓存中没找到

    -------------

    相关文章

      网友评论

          本文标题:Runtime 的方法缓存?存储的形式、数据结构以及查找的过程?

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