iOS底层探索之路 下

iOS底层第三天--isa 和 superclass()

2020-03-26  本文已影响0人  三月木头

OC对象内存中通常包含isa、superclass。为什么需要这些呢,有什么作用。

再次搞清楚,实例对象、类对象、元类对象分别作什么的。简单言之:
实例对象存放 成员变量具体值
类对象存放 对象方法、成员变量存储信息、协议等
元类对象存放 类方法

我们通常用到的isa 是为了找到指定的类对象或者元类对象。
而superclass是为了找到方法所在的对象。

- instance实例对象 class 类对象 meta_class 元类对象
isa 指向class类对象 指向meta_class 元类对象 指向基类的meta_class 元类对象
superclass 指向父类的class、如果没有父类则superclass指针位nil 指向父类的Meta_Class,基类的Meta_Class的superclass指向积累的class
如果继承关系如下:
KCStudent: KCPerson: NSObject

KCStudent中有  -studen方法   +studentClass方法
KCPerson中有   -person方法   +personClass方法

KCStudent *student = [[KCStudent  alloc] init];
[student   person方法];

[KCPerson personClass];

instance实例对象调用方法轨迹:
student 实例根据自身isa找到,KCStudent 类对象,然后查询自身对象方法没有找到person方法,则KCStudent 类对象根据自身的superclass找到KCPerson 类对象,然后查找到person方法。

class类对象调用方法轨迹:
KCPerson 实例对象根据自身isa找到,KCPerson 的元类对象,然后找到 对应的 personClass 方法。

OC对象本质即发消息:
类似objc_msg(对象a,方法A);注意此处方法A是没有区分加减号的,也就是对于iOS来说,其实自身是无法识别+ -方法有什么区别的。内部是通过isa、superclass确定对象、查找到是否有对应的方法的。

isa:
OC的三种对象的内存中都存在isa,isa指向的是上一级的结构体指针(暂时可以这么理解,因为具体是通过位运算& isa_mask 计算出对应的真实地址)。

搜狗截图20200326224722.png 搜狗截图20200326183719.png

类对象、元类对象内存结构是啥样子的?
二者内存结构其实就是结构体 struct objc_class的结构

搜狗截图20200326183521.png

OC类信息存在哪里?
对象方法、属性、成员变量、协议信息存在class对象中
类方法存放在meta_class元类对象中
成员变量的具体值,存放在instance 实例对象中

三种对象内存结构图?

内存结构图.png

isa、superclass答疑时间:
类对象、元类对象什么时候分配、释放?
answer:在程序启动时即加载类信息到内存中,如果程序中需要用这个类则通过调用load。所以相关对象一直存在内存中,退出程序时候才释放。

上一篇 下一篇

猜你喜欢

热点阅读