美文网首页
Runtime - isa

Runtime - isa

作者: 大白菜s | 来源:发表于2019-08-13 18:23 被阅读0次

    每一个oc对象内部都有一个isa指针。
    在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址。
    从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息

    runtime文件源码:

    # if __arm64__
    #   define ISA_MASK        0x0000000ffffffff8ULL
    #   define ISA_MAGIC_MASK  0x000003f000000001ULL
    #   define ISA_MAGIC_VALUE 0x000001a000000001ULL
    #   define ISA_BITFIELD                                                      \
          uintptr_t nonpointer        : 1;                                       \
          uintptr_t has_assoc         : 1;                                       \
          uintptr_t has_cxx_dtor      : 1;                                       \
          uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
          uintptr_t magic             : 6;                                       \
          uintptr_t weakly_referenced : 1;                                       \
          uintptr_t deallocating      : 1;                                       \
          uintptr_t has_sidetable_rc  : 1;                                       \
          uintptr_t extra_rc          : 19
    #   define RC_ONE   (1ULL<<45)
    #   define RC_HALF  (1ULL<<18)
    
    # elif __x86_64__
    #   define ISA_MASK        0x00007ffffffffff8ULL
    #   define ISA_MAGIC_MASK  0x001f800000000001ULL
    #   define ISA_MAGIC_VALUE 0x001d800000000001ULL
    #   define ISA_BITFIELD                                                        \
          uintptr_t nonpointer        : 1;                                         \
          uintptr_t has_assoc         : 1;                                         \
          uintptr_t has_cxx_dtor      : 1;                                         \
          uintptr_t shiftcls          : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
          uintptr_t magic             : 6;                                         \
          uintptr_t weakly_referenced : 1;                                         \
          uintptr_t deallocating      : 1;                                         \
          uintptr_t has_sidetable_rc  : 1;                                         \
          uintptr_t extra_rc          : 8
    #   define RC_ONE   (1ULL<<56)
    #   define RC_HALF  (1ULL<<7)
    
    isa结构-arm64

    nonpointer 0代表普通的指针,存储着Class、Meta-Class对象的内存地址; 1代表优化过,使用位域存储更多的信息
    has_assoc是否有设置过关联对象,如果没有,释放时会更快
    has_cxx_dtor是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
    shiftcls存储着Class、Meta-Class对象的内存地址信息
    magic用于在调试时分辨对象是否未完成初始化
    weakly_referenced是否有被弱引用指向过,如果没有,释放时会更快
    deallocating对象是否正在释放
    extra_rc里面存储的值是引用计数器减1
    has_sidetable_rc引用计数器是否过大无法存储在isa中 如果为1,那么引用计数会存储在一个叫SideTable的类的属性中

    相关文章

      网友评论

          本文标题:Runtime - isa

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