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);
}
网友评论