美文网首页
iOS Class结构

iOS Class结构

作者: 博文得礼 | 来源:发表于2025-04-19 16:27 被阅读0次
在 iOS(Objective-C)中,Class 是对象的元数据结构,用于描述对象的属性、方法、继承关系等。其核心结构基于 Class 层次体系 和 元类(Meta Class) 机制,以下是关键知识点:

一、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)、内存管理、消息机制的基础。

相关文章

网友评论

      本文标题:iOS Class结构

      本文链接:https://www.haomeiwen.com/subject/upoubjtx.html