ISA的初始化&指向分析

2019-12-22  本文已影响0人  瞬间完善

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

ISA的初始化流程(底层源码)

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的时候为什么 & 上一个东西,原因就在这。

上一篇 下一篇

猜你喜欢

热点阅读