美文网首页
cache探索分析

cache探索分析

作者: MrHardy | 来源:发表于2021-06-22 17:43 被阅读0次

    今天我们继续来探究类的原理分析

    断点打印P指令 cache_t jump进入 bucket_t jump进入

    下面通过LLDB去验证方法的存储

    几次失败的尝试 再看下源码 继续尝试

    为什么会是空的值呢?

    因为我用的是模拟器,所以走的是下面的代码 继续看源码 使用sel输出


    (lldb) p $13.imp(nil,pClass)

    (IMP) $15 = 0x0000000100003c80 (HLObjcBuild`-[HLPerson saySomething])

    接下来我们根据源代码

    可以自己定义

    未完待续

    此处为互斥结构 buckets 数组取值

    p $5.sel()->(SEL) $6 = xxxxx  -> p $3+1 指针内存平移取值

    _bucketsAndMaybeMask的使用 不同架构选择 内存地址打印

    0b0000000000000000000000000000000100000000011100001001100110110000

    左边为高地址,右边为低地址

    (lldb) x p ->内存

    0x100744a80: c9 84 00 00 01 80 1d 01 00 00 00 00 00 00 00 00  ................

    0x100744a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    大端模式从左往右 读取8个字节 0x

    00 00 84 c9

    小短模式从右到左 读取8个字节 0x c9 84 00 00

    3/4 扩容 -> 负载因子为0.75 

    1、空间利用率最高

    2、能有效避免哈希冲突碰撞(底层的链表及红黑树频率)

    insert bt-查看整个的堆栈

        frame #1: 0x000000010031374a libobjc.A.dylib`log_and_fill_cache(cls=OS_dispatch_data, imp=(libdispatch.dylib`-[OS_dispatch_data dealloc]), sel="dealloc", receiver=0x00000001007171c0, implementer=OS_dispatch_data)(), objc_selector*, objc_object*, objc_class*) at objc-runtime-new.mm:6305:16

    补充

     Value 为什么等于7呢?

    3->7 是因为发生了类似的扩容

    insert函数

    添加打印语句

     printf("=== %s - %p - %p \n",(char*)sel,imp,receiver);

    跟踪HLPerson

    当sel=say1时,oldCapacity=3,(Capacity是内存)

    1、打印 p [p say1]->po (SEL)地址

    2、打印 p class_getMethodImlementaton([HlPerson class],$1)

    相关文章

      网友评论

          本文标题:cache探索分析

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