Runtime 的方法缓存?存储的形式、数据结构以及查找的过程?
2021-03-16 本文已影响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,如果索引值一直循环减下去,直到等于最开始的索引,则代表缓存中没找到
-------------