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

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 的方法缓存?存储的形式、数据结构以及查找的过程?)