Objective-C之Class底层结构探索
内容提要
该文章讨论了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类的高级特性,如关联属性等。