返回

OC类(Class)探索之路 (续)

IOS

继续探索Objective-C中的类(Class),深入了解它们如何存储对象方法、类方法和成员变量,以及这些存储结构对OC语言特性的影响。

在前面的文章中,我们了解到对象方法存储在类的class_rw_t结构中,而类方法则存储在对应的类的元类class_rw_t中。成员变量则存储在class_ro_t结构中。从这些结构体的命名中,我们可以推断出它们的一些基本特征:

  • class_rw_t:这个结构体用于存储可读写的类信息,包括对象方法和类方法。
  • class_ro_t:这个结构体用于存储只读的类信息,包括成员变量。
  • rw代表read/write(可读写),而ro代表read-only(只读)。

从这些结构体的命名和作用可以看出,OC中的类是一个非常灵活且强大的数据结构。它可以存储各种类型的数据,并且这些数据可以根据需要进行读写操作。这使得OC类非常适合用于构建各种各样的应用程序。

接下来,我们将更深入地探讨这些结构体的内部结构,并了解它们是如何协同工作以支持OC语言的各种特性的。

对象方法

对象方法是OC类的一个重要组成部分。它们允许对象对自身的数据进行操作,并与其他对象进行交互。对象方法存储在类的class_rw_t结构中,这个结构体包含以下成员:

  • isa:指向该类的元类的指针。
  • superclass:指向该类的父类的指针。
  • cache:这是一个指向缓存的指针,缓存中存储着该类及其父类的方法实现。
  • methods:这是一个指向方法列表的指针,方法列表中存储着该类及其父类的方法实现。

当一个对象调用一个方法时,OC运行时系统会首先在该对象的class_rw_t结构中的方法列表中查找该方法。如果找到,则直接执行该方法。如果没有找到,则会沿着类的继承链向上查找,直到找到该方法为止。如果在整个继承链中都没有找到该方法,则会抛出异常。

类方法

类方法是OC类中的另一种重要方法。它们允许类本身对自身的数据进行操作,并与其他类进行交互。类方法存储在类的元类class_rw_t结构中,这个结构体包含以下成员:

  • isa:指向该类的元类的指针。
  • superclass:指向该类的父类的元类的指针。
  • cache:这是一个指向缓存的指针,缓存中存储着该类及其父类的类方法实现。
  • methods:这是一个指向方法列表的指针,方法列表中存储着该类及其父类的类方法实现。

当一个类调用一个类方法时,OC运行时系统会首先在该类的元类class_rw_t结构中的方法列表中查找该方法。如果找到,则直接执行该方法。如果没有找到,则会沿着类的继承链向上查找,直到找到该方法为止。如果在整个继承链中都没有找到该方法,则会抛出异常。

成员变量

成员变量是OC类中的数据成员。它们允许对象存储自己的数据,并与其他对象共享数据。成员变量存储在类的class_ro_t结构中,这个结构体包含以下成员:

  • isa:指向该类的指针。
  • superclass:指向该类的父类的指针。
  • ivars:这是一个指向成员变量列表的指针,成员变量列表中存储着该类及其父类的成员变量。

当一个对象访问一个成员变量时,OC运行时系统会首先在该对象的class_rw_t结构中的成员变量列表中查找该成员变量。如果找到,则直接访问该成员变量。如果没有找到,则会沿着类的继承链向上查找,直到找到该成员变量为止。如果在整个继承链中都没有找到该成员变量,则会抛出异常。

总结

通过对OC类中对象方法、类方法和成员变量的存储结构进行分析,我们可以更深入地理解OC语言的运行机制。这些存储结构使得OC类非常灵活且强大,可以用于构建各种各样的应用程序。