cache_t可以看做一個哈希表,以sel作為key,查找方法的imp。
struct cache_t {
struct bucket_t *_buckets;
mask_t _mask;
mask_t _occupied;
...
}
struct bucket_t *_buckets是一個通過calloc函數(shù)得到的一塊連續(xù)的內(nèi)存,里面存儲的是bucket_t的結(jié)構體,_buckets可以像數(shù)組一樣通過下標index存取值,當存儲的bucket_t超過限制時,會通過expand()函數(shù)進行擴容。
struct bucket_t {
MethodCacheIMP _imp;
cache_key_t _key;
...
};
bucket_t里面包含了我們要找的方法imp。
cache會通過一個哈希算法由sel得到一個index,然后從數(shù)組_buckets中取出對應的bucket_t得到imp。
哈希算法的實現(xiàn):
static inline mask_t cache_hash(cache_key_t key, mask_t mask)
{
return (mask_t)(key & mask);
}
對于有可能出現(xiàn)的哈希沖突,使用了再次哈希的方式來解決:
bucket_t * cache_t::find(cache_key_t k, id receiver)
{
bucket_t *b = buckets();
mask_t m = mask();
mask_t begin = cache_hash(k, m);
mask_t i = begin;
do {
if (b[i].key() == 0 || b[i].key() == k) {
return &b[i];
}
} while ((i = cache_next(i, m)) != begin);
}
cache_next時出現(xiàn)沖突時再次hash得到的下標index。