isa详解
- & 按位与 用来取出特定的位
- 大家都是1才是1, 其他就是0
- 要取哪一位就让取的这位是1, 其他位都是0即可
0011
&0010
----------
0010
0111
&1111
--------
0111 大家都是1 结果才1, 其他结果都是0
0111
&1110
--------
0110 其他结果是0
- | 按位或
- 有一位是1,则全是1
- 要修改哪一位就让哪一位是1
0010 1000
|0000 0010
----------------
0010 1010
union 联合体
arm64位后 isa
的结构变更为union
, 共用一块内存, struct只是做说明展示作用, 告诉你这里面表示什么, 用了几位进行存储
union {
char bits;
struct {
char tall : 1;
char rich : 1;
char handsome : 1;
char thin : 1;
}
}
struct objc_object {
isa_t isa;
}
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
uintptr_t bits;
struct {
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 unused : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 19
}
}
- arm64位架构之前 isa一个
普通的指针
, 直接存放的类, 元类对象的内存地址
- arm64位架构开始, isa进过
优化
改用了union共用体
这种结构, 用位域
将一个64位的内存数据分开按位来存储
更多信息,其中的33位shiftcls
是用来存储类,元类的地址值
, & 一个iSA_MASK通过按位运算 ,以获取到这33位的地址值
位域 取值赋值的原理
WTOptionsOne | WTOptionsThree | WTOptionsFour
相当于WTOptionsOne + WTOptionsThree |+WTOptionsFour
用相加后的值
分别&
上每一项的的值
, 就可以知道当前这一项是否存储其中
WTOptionsOne | WTOptionsTwo | WTOptionsFour
0b0001
0b0010
0b1000
-------
0b1011
WTOptionsOne
0b1011
&0b0001
--------
0b0001
WTOptionsTwo
0b1011
&0b0010
--------
0b0010
WTOptionsFour
0b1011
&0b1000
--------
0b1000
typedef enum{
WTOptionsNone =0 // 0b0000
WTOptionsOne = 1 << 0, // 0b0001
WTOptionsTwo = 1 << 1, // 0b0010
WTOptionsThree = 1 << 2, // 0b0100
WTOptionsFour = 1 << 3 // 0b1000;
} WTOptions;
self.options = WTOptionsOne | WTOptionsThree | WTOptionsFour;
- (void)setOptions:(WTOptions)options
{
if (options & WTOptionsOne) {
NSLog(@"包含 WTOptionsOne");
}
if (options & WTOptionsTwo) {
NSLog(@"包含 WTOptionsTwo");
}
if (options & WTOptionsThree) {
NSLog(@"包含 WTOptionsThree");
}
if (options & WTOptionsFour) {
NSLog(@"包含 WTOptionsFour");
}
}
2022-12-21 19:44:32.059701+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsOne
2022-12-21 19:44:32.059761+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsThree
2022-12-21 19:44:32.059796+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsFour
网友评论