返回
iOS 从源码解析Runtime (十二):深究objc_class(class_rw_t 内容篇)
IOS
2024-02-09 13:49:13
在上一篇文章中,我们分析了 class_rw_t 结构体的 public 部分,接下来,我们继续分析它的 private 部分。
class_rw_t 结构体的 private 部分
class_rw_t 结构体的 private 部分包含以下成员变量:
objc::PointerUnion<const class_ro_t *, class_rw_ext_t>
data
:这是一个联合体,它可以存储一个指向只读类结构的指针,也可以存储一个指向扩展类结构的指针。uint32_t
flags
:这是一个标志位,它包含了一些与类相关的标志。uint8_t
instance_size
:这是一个字节数,它表示该类的实例的大小。uint8_t
ivars
:这是一个字节数,它表示该类的实例变量的数量。uint8_t
methods
:这是一个字节数,它表示该类的实例方法的数量。uint8_t
properties
:这是一个字节数,它表示该类的属性的数量。uint32_t
protocols
:这是一个指针,它指向一个协议列表。objc::PointerUnion<const char *, class_rw_t *>
cache
:这是一个联合体,它可以存储一个指向类名的指针,也可以存储一个指向另一个类的指针。
class_rw_t 结构体成员变量的含义
data
成员变量存储指向只读类结构的指针或扩展类结构的指针。只读类结构包含了类的元信息,如类的名称、超类、协议等。扩展类结构则包含了一些额外的信息,如类的实例变量、实例方法、属性等。flags
成员变量包含了一些与类相关的标志位,如类的访问权限、是否是一个抽象类、是否是一个协议等。instance_size
成员变量表示该类的实例的大小,单位是字节。ivars
成员变量表示该类的实例变量的数量。methods
成员变量表示该类的实例方法的数量。properties
成员变量表示该类的属性的数量。protocols
成员变量指向一个协议列表,该列表包含了该类所遵循的协议。cache
成员变量可以存储一个指向类名的指针,也可以存储一个指向另一个类的指针。当需要获取类的元信息时,Objective-C 运行时会首先检查该成员变量。如果该成员变量存储的是一个指向类名的指针,那么Objective-C 运行时会使用该指针来获取类的元信息。如果该成员变量存储的是一个指向另一个类的指针,那么Objective-C 运行时会使用该指针来获取该类的元信息。
class_rw_t 结构体与 Objective-C 对象
每个 Objective-C 对象都有一个 isa 指针,该指针指向该对象的类。类的 isa 指针指向元类,元类的 isa 指针指向根类。根类的 isa 指针指向它自己。
class_rw_t 结构体与内存管理
Objective-C 使用引用计数来进行内存管理。当一个对象被引用时,它的引用计数就会增加。当一个对象的引用计数为 0 时,该对象就会被销毁。
class_rw_t 结构体与私有指针
Objective-C 中,私有指针是一个指向对象的指针,该指针只能在该对象的类和它的子类中使用。私有指针通常用于实现类的私有成员变量。
class_rw_t 结构体与 isa 指针
isa 指针是一个指向对象的类的指针。isa 指针是 Objective-C 运行时最重要的数据结构之一,它用于消息发送、方法解析等操作。
class_rw_t 结构体与类元信息
类元信息是关于类的信息,如类的名称、超类、协议等。类元信息存储在只读类结构中。
class_rw_t 结构体与元类
元类是一个特殊的类,它表示另一个类的元信息。元类的 isa 指针指向根类。
class_rw_t 结构体与消息发送
当一个对象收到一个消息时,Objective-C 运行时会根据该对象