iOS打印isa指针

2020-07-03  本文已影响0人  RingKun
void printIsa(id obj){
    struct IsaObjc {
        long isa;
    };
    long p = ((__bridge struct IsaObjc *)obj) -> isa;
    int endFlag = 45;
#if __x86_64__
    endFlag = 56;
#endif
    NSLog(@"\n\
          isa: 0x%lx  \n\           // isa
          nonpointer: %ld \n\   // 64位都是1
          has_assoc: %ld \n\  // 
          has_cxx_dtor: %ld \n\
          shiftcls: 0x%lx \n\    // 真实的类对象地址
          magic: 0x%lx \n\     // 魔数
          weakly_referenced: %ld \n\   // 是否存在弱引用
          deallocating: %ld \n\          // 是否正在释放
          has_sidetable_rc: %ld \n\   // 是否有在SideTables存储强引用count
          extra_rc: %lu ",              // isa存储引用count,满了后移动一部分到SideTables,自身保留2^18(mac 2^7), 保证性能。
          p,
          p & 0x1,
          (p & 0x2) >> 1,
          (p & 0x4) >> 2,
          (p & 0x00007ffffffffff8),
          (p & 0x001f800000000001) >> (endFlag - 6),
          (p & 0x0020000000000000) >> (endFlag - 3),
          (p & 0x0040000000000000) >> (endFlag - 2),
          (p & 0x0080000000000000) >> (endFlag - 1),
          (p & 0xff00000000000000) >> endFlag);
}
上一篇 下一篇

猜你喜欢

热点阅读