isa 和 metaclass

835 阅读1分钟

元类是什么?

其实在Objective-C中任何的类定义都是对象。即在程序启动的时候任何类定义都对应于一块内存。在编译的时候,编译器会给每一个类生成一个且只生成一个”描述其定义的对象”,也就是苹果说的类对象(class object),他是一个单例(singleton)。
NSObject内存中的第一个属性是isa,后面有验证

Class是objec_class的实例对象

objec_class是一个结构体,而且标明了第一位是ISA,图示红框处注释

我们注意到上图的第二个位置是superclass我们验证如下

接下来我们新建一个项目看看:
补充一点lldb的操作
p/x :16进制打印内存地址
x/2gx: 打印对象的前两段内存地址,第一位isa,第二位superclass
po:这个不用多说大家都了解

通过上述对内存的操作(第一个16进制都是isa),可以发现:
对象object的isa指向类TestObject,类TestObject的isa指向了元类TestObject,他们的名字是一模一样的,元类是系统在编译期动态生成的。
object对象的isa -> TestObject类 -> 元类TestObject -> NSObject -> NSObject
我们看看苹果给我们的isa走位图:

这个走位图相信大家都有所了解,但是你们有注意一些细节的地方吗?那么我们着重说一下图示标红的3个细节点位:

1.NSObject 的父类是nil。

2.根元类的父类是NSObject。

3.NSObject的isa指向自身。