美文网首页
13期_iOS_cache_t探究

13期_iOS_cache_t探究

作者: 萧修 | 来源:发表于2023-08-15 01:05 被阅读0次

cach_t的结构

struct cache_t {
    struct bucket_t *buckets() const;
    mask_t mask() const;
    mask_t _occupied;
}

buckets:装方法的桶子,里面存放方法的实现imp,根据方法编号sel生成key
mask:扩容因子,同时和key共同计算得出寻找bucket_t的哈希索引
_occupied:是当前占用的容量

x/4gx:按16进制打印4个8字节地址

static void cache_fill_nolock(Class cls, SEL sel, IMP imp, id receiver)
{
    cacheUpdateLock.assertLocked(); ①

    if (!cls->isInitialized()) return; ②
    
    if (cache_getImp(cls, sel)) return; ③

    cache_t *cache = getCache(cls); ④
    cache_key_t key = getKey(sel); ⑤

    mask_t newOccupied = cache->occupied() + 1; ⑥
    mask_t capacity = cache->capacity(); ⑦
    if (cache->isConstantEmptyCache()) { ⑧
        cache->reallocate(capacity, capacity ?: INIT_CACHE_SIZE); ⑨
    } 
    else if (newOccupied <= capacity / 4 * 3) { ⑩
    
    }
    else {
        cache->expand(); ⑪
    }
    bucket_t *bucket = cache->find(key, receiver); ⑫
    if (bucket->key() == 0) cache->incrementOccupied(); ⑬
    bucket->set(key, imp); ⑭
}

缓存锁
判断类是否被初始化,如果未初始化,直接返回
判断sel是否被cls缓存,如果已经被缓存就没必要再走下面的流程,直接返回
通过cls获取cache_t内存地址
通过sel强制生成key
获取cache中当前占有量occupied + 1的值,给下面进行容量判断
取出cache中的容量capacity
⑧ 判断当前占有量是否为0并且桶子的容量是否为空的
⑨占有量为0并且桶子容量为空时,进行reallocate重新分配Buckets和Mask
⑩新的占有量小于等于总容量的3/4时,无另外操作
⑪新的占有量大于总容量的3/4时,进行expand扩容
⑫ 通过key当作哈希下标寻找对应bucket
⑬ 如果key等于0,说明没找到,需要缓存,则cache中的当前占有量 occupied + 1
⑭ 把key和imp装进桶子bucket

相关文章

  • NSRunLoop

    深入理解RunLoop RunLoop深度探究(一) RunLoop深度探究(二) RunLoop深度探究(三) ...

  • 《骆驼祥子》名著导读(1)

    导读目标: 1.探究主人公的主要经历; 2.分析人物形象; 3.探究人物命运的根源。 4.探究小说主题。 一、探究...

  • “课程的逻辑”观后感二十一

    课程的逻辑这本书强调学生的自主探究,那么什么是自主探究,什么是探究性学习?根据书中所说,探究性学习是这样一...

  • 探究学习与理科教学—课程的逻辑第9章学习笔记

    本章旨在探讨“探究学习”的来龙去脉,梳理“探究学习”理论的发展背景、主要内涵及其教育价值。 一、探究学...

  • 探究

    光明不是光明 黑暗不是黑暗 只有跨出的每一步试探 才能找出答案 黑夜的眼睛从不说谎 坚定的步伐从不迷惘 黎明放出曙...

  • 探究

    凌晨两点多了,一夜兴奋,起初还有点困,外面施工,舍友进入打鼾时分,失眠在所难免。 其实眼里是冒星星了。 这时候的舍...

  • 探究

    就像在炒一道菜,材料已经准备好,但还差一味调料,我就非要等着把调料弄齐,再下锅做菜。 好多时候,我的这种性格因子在...

  • 探究

    三十七岁,拒绝称自己是中年,心底已绝望

  • 探究

    一直到今天我才真正接受我不是一个擅于深挖现象本质的人。我一直坚信,一个人的成就一定是ta在背后付出了比常人...

  • 探究

    我自从买了个小巧别致的电动车以来,不仅同事们关注,还引起了我那些可爱的孩子们的关注。 某日,我骑车上班,...

网友评论

      本文标题:13期_iOS_cache_t探究

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