isa指针什么?
isa指针保存着指向对象内存地址,类对象全局只有一个,因此每个创建出来的对象都会默认一个isa属性,保存类对象地址,也就是class,通过class可以查询到这个对象属性方法,协议等;
isa数据结构如下:
可以看出isa一个联合体类型数据;
属性有Class 类型指针cls,和uint类型的bits,以及结构体;
可以看出这个联合体isa内存是8个字节


union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls;
    uintptr_t bits;
#if defined(ISA_BITFIELD)
    struct {
        ISA_BITFIELD;  // defined in isa.h
    };
#endif
};

关键的是ISA_BITFIELD这个数据结构,是个宏定义,里面有几个属性,

#   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
  1. nonpointer:用来标记这个对象是不是tagpointer类型的对象,因为iOS对oc对象进行了优化处理,有些对象是tagpointer类型的,因此这些对象是没有isa指针的,tagpointer内存一般是在棧中的,而不是在堆里面;tagpointer对象一般是NSNumber类型的数值较小的数,或NSString类型的较小的字符串;
  2. has_assoc:用来标记没有关联对象
  3. has_cxx_dtor:该对象是否有 C++ 或者 Objc 的析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快的释放对象
  4. shiftcls:存储的isa指针地址,也就是累对象的地址
  5. magic:用于调试器判断当前对象是真的对象还是没有初始化空间
  6. weakly_referenced:对象是否指向或者曾经指向一个 ARC 的弱变量没有引用的对象可以更快释放
  7. deallocating:标志对象是否正在释放内存
  8. has_sidetable_rc:标记对象是否使用了Sidetable,当对象引用计数大于 10 时,则需要借用该变量存储进位
  9. extra_rc:当表示该对象的引用数值,实际上是引用数值减 1, 例如,如果对象的引用计数为 10,那么 extra_rc 为 9。如果引用计数大于 10, 则需要使用到下面的 has_sidetable_rc

原文地址:https://blog.csdn.net/sinat_34245894/article/details/122393531

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43440.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注