美文网首页
ISA - objc4-818.2

ISA - objc4-818.2

作者: 今天星期 | 来源:发表于2021-07-08 17:06 被阅读0次

    opensource.apple.com/source

    
    [#include](fsnotes://open/?tag=include) "isa.h"
    
    union  isa_t {
    
     isa_t() { }
    
     isa_t(uintptr_t value) : bits(value) { }
    
     uintptr_t bits;
    
    private:
    
      // Accessing the class requires custom ptrauth operations, so
    
      // force clients to go through setClass/getClass by making this
    
      // private.
    
     Class cls;
    
    public:
    
    [#if](fsnotes://open/?tag=if) defined(ISA_BITFIELD)
    
      struct {
    
     ISA_BITFIELD; // defined in isa.h
    
     };
    
      bool  isDeallocating() {
    
     return extra_rc == 0 && has_sidetable_rc == 0;
    
     }
    
      void  setDeallocating() {
    
     extra_rc = 0;
    
     has_sidetable_rc = 0;
    
     }
    
    [#endif](fsnotes://open/?tag=endif)
    
     void setClass(Class cls, objc_object *obj);
    
     Class getClass(bool authenticated);
    
     Class getDecodedClass(bool authenticated);
    
    };
    
    
    isa_t() { }      > 无参数的构造函数
    isa_t(uintptr_t value) : bits(value) { }   >> 有参数的构造函数
    

    构造函数,主要用来在创建对象时初始化对象,即为对象成员变量赋初值。命名和类名相同,不可直接调用, 创建对象自动调用。 如果创建一个类,没有写构造函数,会自动生成无参数的构造函数。

    #   define ISA_MASK        0x00007ffffffffff8ULL
    #   define ISA_MAGIC_MASK  0x001f800000000001ULL
    #   define ISA_MAGIC_VALUE 0x001d800000000001ULL
    #   define ISA_HAS_CXX_DTOR_BIT 1
    #   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 unused            : 1;                                         \
          uintptr_t has_sidetable_rc  : 1;                                         \
          uintptr_t extra_rc          : 8
    

    nonpointer --- 0 代表普通的指针,存储这class meta-class对象的内存地址,1 代表优化过,使用位域存储更多的信息
    has_assoc --- 是否设置过关联对象,如果没有,释放时会更快
    has_cxx_dtor --- 是否有c++的析构函数 ,如果没有,释放的会更快
    shiftcls --- 存储着class,meta_class 对象的内存地址
    magic --- 用于在调试时分辨对象是否未完成初始化
    weakly_referenced --- 是否被弱引用指向过,如果没有,释放的会更快
    has_sidetable_rc --- 引用计数器是否过大无法存储在ISA中,如果是1 那么引用技术会存储在一个叫sidetable的类的属性中
    extra_rc --- 里面存储的值是引用计数器减1
    unused --- 是否被释放
    uintptr_t == typedef unsigned long int uintptr_t; ## 它是一个与指针大小完全相同的无符号整数类型

    c 语言包含的数据类型

    基本类型 ’. 数值类型(整,浮点型) ‘ '.字符类型char'
    构造类型 数组, 结构体 共用体 枚举enum
    指针类型
    空类型(void)

    结构体和联合体(共用体)

    结构体是struct 标识,所占内存为所有成员变量占用大小之和或者大于
    联合体是union 标识,所占内存为最大成员变量大小的值

    区别:结构体的成员会占不同的内存,互相之间不影响,而共用体的所有成员占用同一内存,修改一个成员会影响到其余所有成员。

    格式: union 共用体名{
    成员列表
    };
    eg:(注意内存对齐)

    相关文章

      网友评论

          本文标题:ISA - objc4-818.2

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