本文介绍: isa指针是什么?isa指针指向的是类对象,类对象全局只有一个,因此每个类创建出来的对象都会保存类对象的地址,也就是isa,通过isa就可以查询到这个对象的属性和方法,协议等;isa数据结构如下:可以看出isa是一个联合体类型的数据;属性有Class 类型指针cls,和uint类型的bits,以及结构体;可以看出这个联合体isa的内存是8个字节union isa_t { isa_t() { } isa_t(uintptr_t value) : bits(value) { }
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
- nonpointer:用来标记这个对象是不是tagpointer类型的对象,因为iOS对oc对象进行了优化处理,有些对象是tagpointer类型的,因此这些对象是没有isa指针的,tagpointer的内存一般是在棧中的,而不是在堆里面;tagpointer对象一般是NSNumber类型的数值较小的数,或NSString类型的较小的字符串;
- has_assoc:用来标记有没有关联对象
- has_cxx_dtor:该对象是否有 C++ 或者 Objc 的析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快的释放对象
- shiftcls:存储的isa指针地址,也就是累对象的地址
- magic:用于调试器判断当前对象是真的对象还是没有初始化的空间
- weakly_referenced:对象是否被指向或者曾经指向一个 ARC 的弱变量,没有弱引用的对象可以更快释放
- deallocating:标志对象是否正在释放内存
- has_sidetable_rc:标记对象是否使用了Sidetable,当对象引用计数大于 10 时,则需要借用该变量存储进位
- 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进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。