oc - 基础 runtime_isa

119 阅读2分钟
  1. 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) }