我们都知道 alloc创建了对象并且分配内存;同时初始化isa属性;我们也知道了OC 对象在底层本质上是结构体,所有的对象里面都会包含有一个isa,isa的定义是一个联合体isa_t,isa_t包含了当前对象指向类的信息
ISA的初始化流程(底层源码)

ISA 在Xcode中使用 LLDB指令 指向分析
其中一些LLDB指令:
x/4gx objc 打印objc的4段内存信息。扩展:x/6gx就是打印6段内存信息。
p/t 打印二进制信息;
p/o 打印八进制信息;
p/x 打印十六进制信息;

上面有个问题就是 为什么外面的isa打印出来的是Class?
直接上源码
```
inline Class
objc_object::ISA()
{
assert(!isTaggedPointer());
#if SUPPORT_INDEXED_ISA
if(isa.nonpointer) {
uintptr_t slot = isa.indexcls;
returnclassForIndex((unsigned)slot);
}
return(Class)isa.bits;
#else
return(Class)(isa.bits&ISA_MASK);
#endif
}
```
以上我们可以看出,我们找isa 通过底层源码之后,最后return的isa都是强转成Class的,所以我们上面打印isa的时候为什么 & 上一个东西,原因就在这。
网友评论