isa分析

作者: 浪的出名 | 来源:发表于2020-09-10 17:14 被阅读0次

isa详解

  • 在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址
  • 从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息,具体结构如下
union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls;
    uintptr_t bits;
    struct {
        ISA_BITFIELD;  // defined in isa.h 下面是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
    };
};

isa详解-位域

  • 位域(又叫做位段)其实是一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。有些信息在存储的时候,并不需要占用一个完整字节,有时候只需要占用一个或几个二进制位,比如存放一个BOOL类型的变量时,只需要保存0或1两种状态,此时只需要1个二进制位就能存储。因此,位域就是运用在这种场景下的一种数据结构,使用位域可以有效的节省存储空间。
  • 位域可以把一个字节中的二进制位划分为几个不同的区域,并且制定每个区域占用的位数,每个域可以设置一个域名,可以根据域名对指定的位进行操作。
  • 但是位域也有明显的缺点,就是它的内存分配和内存对齐的方式依赖于具体的机器和操作系统,不同的平台可能会有不同的结果。
  • 位域的结构和结构体类似,它的形式为
struct 位域结构名称{
    类型说明符 位域名 : 位域长度;
    类型说明符 位域名 : 位域长度;
    类型说明符 位域名 : 位域长度;
    ......
}

isa的结构

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

相关文章

  • iOS底层探索004-类分析

    iOS底层探索-目录 1. 类的分析 主要分析两个部分:isa的走向和继承关系 isa分析 类的isa走向,参考这...

  • Cache_t的结构和原理

    在之间的文章里我们分析了isa的指向和结构isa结构分析,分析了bits类的结构分析,在这篇文章里,我们来分析ob...

  • isa分析

    isa详解 在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址 ...

  • iOS底层原理探究05-类的底层原理isa链&继承链&类的内存结

    isa指向分析 通过《iOS底层原理探究04-OC对象的本质&联合体位域&isa分析》[https://www.j...

  • isa 走位&类对象&元类

    经典isa走位图 分析我们实例化的对象因为继承 由objc_object 结构体模板 所以里面 有isa。isa是...

  • iOS Objective-C isa 走位分析

    iOS Objective-C isa 走位分析 1. 判断isa是对象的第一个属性 isa<-->cls的关联 ...

  • iOS - isa的初始化&指向分析

    isa结构及初始化分析 什么是isa,首先我们先看一下isa的结构: 由源码我们可以看出:isa的本质就是一个联合...

  • 类的结构分析

    我们在上一节isa的结构分析分析了isa的结构,我们在创建一个类的时候打印其地址得到的第一个地址就是它的isa地址...

  • OC对象的种类和分析

    先说分析结论 1.对象 isa 指针的指向?instance 对象的 isa 指向 class 对象class 对...

  • 类的结构分析

    前言 书接上回isa结构分析,我们得知,对象的isa指针指向类,确切的说,是isa指针的shiftcls位域中指向...

网友评论

      本文标题:isa分析

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