iOS底层探索 之 对象的本质

113 阅读1分钟

首先我们先定义一个类

image.png

猜想“当前的类会和我们的对象一样,可以无限开辟吗?也就是在内存里不止有一个类?”

下面我们开始验证,这几个地址是否一致?

image.png

image.png 打印的结果居然都一致,但0x100008360-它不是类,那它是什么呢?

我们首先得知道 对象的isa 指向 类,类的isa 指向 元类(元类是由系统生成和编译的),那元类的isa呢?指向什么?

下面用p/x 指令依次往下,可以得出根类的isa 指向 根元类isa,如下图所示:

image.png 上代码

image.png

image.png 得出结论:元类的父类就是当前的根元类

继续探索

image.png 输出

NSObject - 0x7fff806fdfe0 HLPerson - 0x100008338

是出问题了吗?怎么和见上图的指向判断不一致的?

HLTeacher 继承-> HLPerson 继承-> NSObject 这样一条继承链

元类也有一条继承链

image.png

还有一个问题就是只要到NSOject的时候就会有特殊情况

image.png 输出 (null) - 0x0

NSObject - 0x7fff806fe008

NSObject - 0x7fff806fe008 和上面的类是一样的,又回到了原点。又回到了NSObject。

接着看官方的isa流程图

image.png

未完待续......