首先我们先定义一个类
猜想“当前的类会和我们的对象一样,可以无限开辟吗?也就是在内存里不止有一个类?”
下面我们开始验证,这几个地址是否一致?
打印的结果居然都一致,但0x100008360-它不是类,那它是什么呢?
我们首先得知道 对象的isa 指向 类,类的isa 指向 元类(元类是由系统生成和编译的),那元类的isa呢?指向什么?
下面用p/x 指令依次往下,可以得出根类的isa 指向 根元类isa,如下图所示:
上代码
打印的结果得出结论:元类的父类就是当前的根元类
继续探索
输出
NSObject - 0x7fff806fdfe0
HLPerson - 0x100008338
是出问题了吗?怎么和见上图的指向判断不一致的?
HLTeacher 继承-> HLPerson 继承-> NSObject 这样一条继承链
元类也有一条继承链
元类的继承链还有一个问题就是只要到NSOject的时候就会有特殊情况
输出
(null) - 0x0
NSObject - 0x7fff806fe008
NSObject - 0x7fff806fe008 和上面的类是一样的,又回到了原点。又回到了NSObject。
接着看官方的isa流程图
未完待续......
网友评论