一、Class 的本质
• 定义:Class 类的本质是指向objc_class结构体的指针
typedef struct objc_class *Class;
// objc_class继承自objc_object(所有对象的基类结构)
struct objc_class : objc_object {
// 1. 指向元类(metaclass)的isa指针
Class isa;
// 2. 指向父类的指针
Class superclass;
// 3. 方法缓存
cache_t cache;
// 4. 类的核心数据(包含可读写信息和标志位)
class_data_bits_t bits;
};
// 所有对象的基类结构(类对象也继承自它)
struct objc_object {
Class isa;
// 指向所属类(实例对象指向类,类对象指向元类)
};
方法缓存
struct cache_t {
struct bucket_t *_buckets; // 哈希表,存储SEL(方法选择器)与IMP(方法实现指针)的映射
mask_t _mask; // 哈希表容量(减1),用于计算索引
mask_t _occupied; // 已缓存的方法数量
};
核心关联:
通过bits.data()可提取class_rw_t指针,class_rw_t包含:
struct class_rw_t {
class_ro_t *ro; // 指向编译期确定的只读信息(如类名、初始方法列表)
method_array_t methods; // 运行时动态添加的实例方法
method_array_t class_methods; // 运行时动态添加的类方法
property_array_t properties; // 运行时动态添加的属性
protocol_array_t protocols; // 运行时动态添加的协议
};
二、类的层次体系
1. 实例对象(Instance)
• 由类(Class)创建,isa 指向所属的 类(Class)。
NSObject *obj = [[NSObject alloc] init];
obj.isa → NSObject Class(类)
2. 类对象(Class)
• 每个类本身也是一个对象,称为 类对象,存储类方法(如 +alloc)。
• isa 指向所属的 元类(Meta Class)。
Class cls = [NSObject class];
cls.isa → NSObject Meta Class(元类)
3. 元类(Meta Class)
• 存储类方法的结构体,是类对象的“类”。
• 根元类(如 NSObject 元类)的 isa 指向自身,形成闭环:
NSObject Meta Class.isa → NSObject Meta Class(自身)
4. 继承关系
• 类对象的 super_class 指向父类的类对象(如 UIView 的 super_class 是 NSObject)。
• 元类的 super_class 指向父类的元类,根元类的 super_class 指向根类(如 NSObject 元类的 super_class 是 NSObject 类)。
三、关键指针:isa 与 super_class
1. isa 指针的作用
• 实例对象通过 isa 找到类,类对象通过 isa 找到元类,元类通过 isa 形成闭环。
• 消息传递核心:调用实例方法时,通过实例的 isa 找到类的方法列表;调用类方法时,通过类的 isa 找到元类的方法列表。
2. super_class 指针的作用
• 用于实现继承链上的方法查找(动态绑定)。
若当前类未找到方法,沿 super_class 向上查找父类,直至 NSObject。
元类的 super_class 链用于查找父类的类方法。
四、Class 的核心操作
1. 获取类对象
• [ClassName class] 或 [instance class](实例的 class 方法返回所属类)。
• object_getClass(instance):返回实例的 isa 指向的类(与 class 方法结果相同,除非是元类)。
2. 运行时操作(Runtime)
• 通过 objc_runtime.h 访问类的方法、属性、协议等:
#import <objc/runtime.h>
// 获取类的所有实例方法
unsigned int methodCount;
Method *methods = class_copyMethodList(NSObject.class, &methodCount);
3. 类方法与实例方法的存储
• 实例方法:存储在类对象的 instance_methods 列表中。
• 类方法:存储在元类对象的 instance_methods 列表中(元类本质上也是类,类方法视为元类的实例方法)。
五、内存布局与性能
• 内存对齐:objc_class 结构体需满足内存对齐规则,提升访问效率。
• 缓存优化:类维护一个 cache 结构,缓存最近调用的方法,减少方法查找耗时。
总结:Class 结构的核心逻辑
• 消息传递:通过 isa 和 super_class 链实现动态方法查找。
• 设计目的:支持继承、多态、运行时特性(如分类、动态添加方法)。
理解 Class 结构是掌握 Objective-C 运行时(Runtime)、内存管理、消息机制的基础。













网友评论