返回

真切探寻 Class 的内部结构,深入了解 iOS 底层原理

IOS




深入剖析 Class 的结构

在上一章中,我们对 isa 的本质结构有了新的认识,而今天,我们将重点探究 Class 的结构,进一步了解 Class 的内部细节。首先,让我们通过代码回顾一下 Class 的内部结构:

struct objc_class {
  Class isa;
  Class superclass;
  ClassCache *cache;
  ClassMethodArray *methods;
  ClassPropertyArray *properties;
  ProtocolList *protocols;
  const char *name;
  long version;
  long info;
  long instance_size;
  long ivars;
  long weak_ivars;
  long bitfields;
  MethodList *methodsBySelector;
  PropertyList *propertiesByName;
  ProtocolList *protocolsByName;
  MethodCache *cache_ptr;
};

各个成员变量的详解

  1. isa: isa 指针指向该类的元类,元类是对类的,包含了类的信息和方法。

  2. superclass: superclass 指针指向该类的父类,子类可以继承父类的方法和属性。

  3. cache: cache 是一个 ClassCache 结构体的指针,用于缓存类的方法和属性。

  4. methods: methods 是一个 ClassMethodArray 结构体的指针,用于存储类的方法列表。

  5. properties: properties 是一个 ClassPropertyArray 结构体的指针,用于存储类的属性列表。

  6. protocols: protocols 是一个 ProtocolList 结构体的指针,用于存储类所遵循的协议列表。

  7. name: name 是一个指向类名的常量字符指针。

  8. version: version 是一个 long 类型的数据,用于存储类的版本号。

  9. info: info 是一个 long 类型的数据,用于存储类的信息,比如类的标志和修饰符。

  10. instance_size: instance_size 是一个 long 类型的数据,用于存储类实例的大小。

  11. ivars: ivars 是一个 long 类型的数据,用于存储类实例变量的数量。

  12. weak_ivars: weak_ivars 是一个 long 类型的数据,用于存储类实例变量中弱引用的数量。

  13. bitfields: bitfields 是一个 long 类型的数据,用于存储类的位字段信息。

  14. methodsBySelector: methodsBySelector 是一个 MethodList 结构体的指针,用于存储类的方法列表,按选择器进行索引。

  15. propertiesByName: propertiesByName 是一个 PropertyList 结构体的指针,用于存储类