- OC 消息转发机制
首先了解 ISA 指针
arm 64之后 是优化成了 一个union 共用体 还使用位域来存储更多信息
union { class cls; uinptr_t bits; struct {
uinptr_t nonpointer : 1; 指针是否被优化过
uinptr_t hasAssoc : 1; 是否设置了关联对象
uinptr_t has_cxx_dtor : 1; 是否有C++的析构函数
uinptr_t shifcls : 33;存放着Class .mate class的内存地址信息
uinptr_t magic : 6;调试的时候分辨对象是否完成初始化
uinptr_t weakly_referenced : 1;是否又被弱引用指向过
uinptr_t deallocating : 1;是否正在被释放
uinptr_t has_sidetable_rc : 1;
uinptr_t extra_rc : 19;存储的是引用计数器减一
}
}
0011 &1111
0011
#define TallMask 0b00 0000 0001 = (1 << 0) 最好小括号
#define richMask 0b00 0000 0010 = (1 << 1)
#define hansomeMask 0b00 0000 0100 = (1 << 2)
& 与,运算, 相同为1 不通为0
要取哪一位 就把& 变为1其他变为0
能取出特定位的值
设置对应的值 或 运算 |只有有一个1 其他都是1 0010 1000 |0000 0010
0010 1010 得到结果 并把第二位 设置为 1了
如果想将某一位 职位0 的话 用& 与运算
0010 1000 &1111 1101
0010 1010;得到结果 并把第二位 设置为 0了
{ char _tallRichHansome; //0b 0000 0011; //如果转换为结构体 struct { char tall : 1 (1)设定只占一位 char rich : 1 char hansome : 1 } _tallRichHansome
用一个字节存储的话 0xff = 255 = -1
// 使用共用体
何为共用体?
union {
char bits;
struct { // 用这个 struct 可读性 增加
char tall : 1 (1)设定只占一位
char rich : 1
char hansome : 1
}
}_tallRichHansome
}
- (void)setTall:(int)tall{
//使用结构体赋值方便
_tallRichHansome.tall = tall;
// 如果不适用 结构体
if (tall) {
_tallRichHansome |= TallMask;
} else {
_tallRichHansome &=
TallMask; (按位取反) }
}
-
(Bool)isTall { //取最后一位 return __tallRichHansome & 1; (0b 0000 0001) }
-
(Bool)isRich { 取最后弟2位 return __tallRichHansome & 2; (0b 0000 0010) }
-
(Bool)isHansome { 取最后弟3位 return __tallRichHansome & 4; (0b 0000 0100) }