在arm64之前,isa是一个普通的指针,存储着class和meta-class的内存地址
从arm64之后,isa指针变成了一个共用体,还使用位域来存储更多的信息
取值:取哪一位,哪一位为1,其他为0,取&,例如:取出1101中的第二个1
0000 1101
&0000 0100(取值的那位置为1,其他位为0,取&)(掩码mask)
0000 0100
赋值:赋0,例如将1101中第二个1,置为0
0000 1101
&1111 1011(赋值位为0,其他位置为1,取&)(掩码mask)
0000 1001
赋值:赋1,例如将1001中第一个0,置为1
0000 1001
| 0000 0100(赋值位为1,其他位置为0,取|)(掩码mask)
0000 1101
用结构体来取代多个mask 的定义
struct {
char first : 1;
char second:1;
char third:1
}Mask;
共用体
union {
char bites;//(结构体大于一个字节的时候使用int,long等)
struct{
char first : 1;
char second:1;
char third:1
}
}Mask;
isa的内存结构,shiftcls占33位,表示指向的类或者元类

(1)non pointer,为0表示直接是类或者元类的指针,1表示经过优化的,使用用位域和共用体,存放更多信息的
(2)has_assoc是否是关联对象,没有的话,释放更快
(3)是否有c++的

本文详细介绍了Objective-C中的isa指针,包括其在arm64之前的简单形式和之后的复杂结构,如位域存储更多信息,如何进行取值、赋值操作。还讨论了isa的内存结构,如non pointer标志、has_assoc、has_cxx_dtor、shiftcls、magic、weakly_referenced和引用计数等关键属性,以及它们在对象生命周期和内存管理中的作用。

2632

被折叠的 条评论
为什么被折叠?



