真切探寻 Class 的内部结构,深入了解 iOS 底层原理
2023-09-14 06:33:05
深入剖析 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;
};
各个成员变量的详解
-
isa: isa 指针指向该类的元类,元类是对类的,包含了类的信息和方法。
-
superclass: superclass 指针指向该类的父类,子类可以继承父类的方法和属性。
-
cache: cache 是一个 ClassCache 结构体的指针,用于缓存类的方法和属性。
-
methods: methods 是一个 ClassMethodArray 结构体的指针,用于存储类的方法列表。
-
properties: properties 是一个 ClassPropertyArray 结构体的指针,用于存储类的属性列表。
-
protocols: protocols 是一个 ProtocolList 结构体的指针,用于存储类所遵循的协议列表。
-
name: name 是一个指向类名的常量字符指针。
-
version: version 是一个 long 类型的数据,用于存储类的版本号。
-
info: info 是一个 long 类型的数据,用于存储类的信息,比如类的标志和修饰符。
-
instance_size: instance_size 是一个 long 类型的数据,用于存储类实例的大小。
-
ivars: ivars 是一个 long 类型的数据,用于存储类实例变量的数量。
-
weak_ivars: weak_ivars 是一个 long 类型的数据,用于存储类实例变量中弱引用的数量。
-
bitfields: bitfields 是一个 long 类型的数据,用于存储类的位字段信息。
-
methodsBySelector: methodsBySelector 是一个 MethodList 结构体的指针,用于存储类的方法列表,按选择器进行索引。
-
propertiesByName: propertiesByName 是一个 PropertyList 结构体的指针,用于存储类