返回

iOS 从源码解析Runtime (十二):深究objc_class(class_rw_t 内容篇)

IOS

在上一篇文章中,我们分析了 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 运行时会根据该对象