美文网首页selector
iOS NONPOINTER_ISA(非指针类型)

iOS NONPOINTER_ISA(非指针类型)

作者: Shineyok | 来源:发表于2021-09-30 13:50 被阅读0次

isa分为POINTER_ISA(指针类型)和NONPOINTER_ISA(非指针类型)

POINTER_ISA指针类型只有一个内存地址

NONPOINTER_ISA除了有地址,还包含其他字段:

//arm64 架构
struct 
{
    uintptr_t nonpointer        : 1;  // 0:普通指针,1:优化过,使用位域存储更多信息
    uintptr_t has_assoc         : 1;  // 对象是否含有或曾经含有关联引用,如果没有,则析构时会更快
    uintptr_t has_cxx_dtor      : 1;  // 表示是否有C++析构函数或OC的dealloc,如果没有,则析构时会更快
    uintptr_t shiftcls          : 33; // 类的指针,存放着 Class、Meta-Class 对象的内存地址信息
    uintptr_t magic             : 6;  // 固定值为 0xd2,用于在调试时分辨对象是否未完成初始化
    uintptr_t weakly_referenced : 1;  // 是否被弱引用指向,如果没有,则析构时更快
    uintptr_t deallocating      : 1;  // 对象是否正在释放
    uintptr_t has_sidetable_rc  : 1;  // 是否需要使用 sidetable 来存储引用计数
    uintptr_t extra_rc          : 19;  // 引用计数能够用 19 个二进制位存储时,直接存储在这里
  };

has_sidetable_rc表明该对象的引用计数器是否过大而无法储存到isa指针,如果过大,则其会存入相应的sideTable(散列表)中,正常则存入extra_rc中,且extra_rc保存的是引用计数减1后的结果

相关文章

  • iOS NONPOINTER_ISA(非指针类型)

    isa分为POINTER_ISA(指针类型)和NONPOINTER_ISA(非指针类型) POINTER_ISA指...

  • 非指针型ISA(NONPOINTER_ISA)

    在arm64架构下,指针在内存中占8个字节/byte,即64位/bit(1byte=8bit),64比特位中存储的...

  • NONPOINTER_ISA和散列表

    NONPOINTER_ISA 这个设计思想跟TaggetPointer类似,ISA其实并不单单是一个指针。其中一些...

  • C语言-1、基本数据类型、指针、函数

    头文件 基本数据类型 boolean 非0即true, 0就是false NULL 指针(%p、&、*) 指针大小...

  • 引用类型对象拷贝

    1.引用类型有哪些?非引用类型有哪些? 引用类型是指那些存在堆内存中的对象,变量中保存的知识一个指针,这个指针指向...

  • JS小记.4

    引用类型有哪些?非引用类型有哪些 引用类型指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针...

  • 0106引用类型、对象拷贝

    1.引用类型有哪些?非引用类型有哪些引用类型:对象、数组、函数、正则。变量中保存的是指向存储数据内容位置的指针非引...

  • 指针运算

    指针的类型与指针指向的类型明显不相等 指针的类型表示指针自身的类型; 指针指向类型表示指针指向数据(内存)的类型。...

  • 引用类型和对象拷贝

    引用类型有哪些?非引用类型有哪些? 引用类型是指那些保存在堆内存中的对象。变量中保存的实际上只是一个指针,这个指针...

  • 20170506

    引用类型有哪些?非引用类型有哪些引用类型是指那些保存在堆内存中的对象。变量中保存的实际上只是一个指针,这个指针指向...

网友评论

    本文标题:iOS NONPOINTER_ISA(非指针类型)

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