开局一张图
刚开始看这图时,我也是懵的
其实也很好理解,这得分开看
虚线
isa
实线
superclass
根类、基类 一般都是指:NSObject
isa的走位
实例对象(Instance of Subclass)
的isa
指向 类(class)
类对象(class)
的isa
指向 元类(Meta class)
元类(Meta class)
的isa
指向根元类(Root metal class)
元类(Root metal class)
的isa
指向它自己本身
,形成闭环,这里的根元类就是NSObject
superclass(继承关系)走位
类(subClass)
继承自 父类(superClass)
父类(superClass)
继承自 根类(RootClass )
,此时的 根类
是指 NSObject
根类
继承自 nil
,所以 根类即 NSObject可以理解为万物起源
子类的 元类(metal SubClass)
继承自 父类的 元类(metal SuperClass)
父类的 元类(metal SuperClass )
继承自 根元类(Root metal Class)
根元类(Root metal Class
) 继承于 根类(Root class )
,此时的 根类是指 NSObject
【注意】 实例对象之间 没有 继承关系,类之间有继承关系
一个objc对象如何进行内存布局?(考虑有父类的情况)
- 所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中.
- 每一个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本对象的
- 对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)
- 成员变量的列表,
- 属性列表,
它内部也有一个isa指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有一个superclass的指针,指向他的父类对象。
每个 Objective-C 对象都有相同的结构,如下图所示:
image.png翻译过来就是
Objective-C 对象的结构图 |
---|
ISA指针 |
根类的实例变量 |
倒数第二层父类的实例变量 |
... |
父类的实例变量 |
类的实例变量 |
-
根对象就是NSObject,它的superclass指针指向nil
-
类对象既然称为对象,那它也是一个实例。类对象中也有一个isa指针指向它的元类(meta class),即类对象是元类的实例。元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。
网友评论