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 计算出对应的真实地址)。


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

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

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