Objective-C之Class底层结构探索

💡 原文中文,约11700字,阅读约需28分钟。
📝

内容提要

该文章讨论了OC类的底层类结构和数据存储方式,包括isa走位图、superclass指向父类和根类的关系,以及各种数据结构的作用和存储方式。文章还介绍了method_t和cache_t结构体的使用和类方法缓存的实现方式。

🔎

延伸解读

isa与superclass的指向关系

文章通过isa走位图明确了类、父类、元类之间的指向规则:类的isa指向元类,元类的isa指向根元类,根元类的isa指向自身;类的superclass指向父类,最终指向根类,根类的superclass为nil。元类的superclass指向父元类,最终指向根元类,根元类的superclass指向根类。这些规则是理解OC对象模型的基础。

方法缓存的实现与扩容机制

cache_t使用散列表(bucket_t数组)缓存常调用的方法,通过方法名与mask值进行按位与运算得到索引,从而快速定位方法实现。当缓存方法数量增加时,散列表会进行2倍扩容,但扩容时会清空之前的缓存,然后重新存储新方法。这种设计以空间换时间,提高了方法调用的效率。

类信息的存储结构:class_ro_t与class_rw_t

class_ro_t存储类的初始信息,包括方法、协议、属性、成员变量等,是只读的。程序运行时,class_ro_t的信息会合并到class_rw_t中,class_rw_t是可读写的,用于动态添加方法、协议等。class_rw_ext_t则进一步管理高级特性如关联属性。这种分离设计支持了OC运行时的动态性。

method_t与类型编码

method_t结构体包含方法名(SEL)、类型编码(types)和函数指针(IMP)。类型编码如“v16@0:8”描述了方法的返回值、参数类型及偏移量,其中v表示void,@表示id,:表示SEL。这些编码在运行时用于方法签名和消息转发,是OC动态调用机制的重要组成部分。

❓

Q&A

Objective-C中的isa走位图是什么?

isa走位图展示了类、父类和元类之间的关系,包括它们的isa和superclass指向。

cache_t结构体在OC类中有什么作用?

cache_t用于缓存常调用的方法,以提高查找效率。

class_rw_t和class_ro_t有什么区别?

class_rw_t存储运行时信息,允许修改,而class_ro_t存储只读的初始信息。

method_t结构体包含哪些信息?

method_t结构体包含方法名、类型和实现指针。

如何通过mask值计算方法在散列表中的索引?

通过将方法的选择器与mask值进行位运算,可以计算出方法在散列表中的索引。

class_rw_ext_t的作用是什么?

class_rw_ext_t用于管理OC类的高级特性,如关联属性等。

🏷️

标签

➡️

继续阅读