isa 和 metaclass

元类是什么?

其实在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。bash

2.根元类的父类是NSObject。markdown

3.NSObject的isa指向自身。spa

相关文章
相关标签/搜索