返回

iOS类的底层探索(上)

IOS

iOS 类的底层探索(上)

类的本质

在 Objective-C 中,类是对象的基础。每个对象都属于一个特定的类,类定义了对象的属性和方法。类的本质可以归结为以下几个方面:

  1. 类型信息: 类提供有关对象类型的信息,包括对象的属性和方法。
  2. 内存布局: 类定义了对象在内存中的布局,包括属性和方法的偏移量。
  3. 行为: 类指定了对象的行为,包括如何响应消息和处理事件。

isa 分析

isa("is-a")指针是 Objective-C 对象的一个重要成员变量。它指向该对象的类对象。通过 isa 指针,我们可以确定对象的类型并访问其类定义的信息。isa 指针对于 Objective-C 的动态性至关重要,因为它允许对象在运行时改变其类型。

类与元类的继承关系

每个类都有一个元类。元类是类的类。它包含有关类本身的信息,包括类的属性和方法。类和元类的继承关系允许我们对类本身进行编程。例如,我们可以添加自定义方法或属性到一个类,甚至创建新的类。

类对象的数据结构

类对象是类的实际表示。它存储有关类本身的信息,包括其名称、父类、属性和方法。类对象的数据结构通常如下:

struct objc_class {
    Class isa;
    Class superclass;
    const char *name;
    long version;
    long info;
    long instance_size;
    long ivars;
    long methods;
    MethodList *methods;
    IvarList *ivars;
    Class reserved[3];
};

内存偏移

对象的每个属性和方法都有一个内存偏移量。这个偏移量指定了属性或方法在对象内存中的相对位置。通过使用内存偏移量,我们可以快速有效地访问对象的属性和方法。

bits 解析

类对象中包含一个名为 "info" 的 long 型成员变量。这个成员变量包含有关类的各种信息,包括:

  • 类是否是一个元类
  • 类是否是一个协议
  • 类的内存管理策略
  • 类的根元类

可以通过使用掩码和位运算来解析 "info" 成员变量中的信息。

实例对象的方法列表和属性列表存储结构

实例对象的方法列表和属性列表存储在类对象中。方法列表是一个指向 MethodList 结构的指针,而属性列表是一个指向 IvarList 结构的指针。这些结构如下所示:

struct MethodList {
    unsigned int entsize;
    unsigned int count;
    Method *list;
};

struct IvarList {
    unsigned int entsize;
    unsigned int count;
    Ivar *list;
};

结论

了解 iOS 类的底层实现对于 Objective-C 开发人员至关重要。通过深入了解类的本质、isa 指针、类与元类的继承关系、类对象的数据结构、内存偏移、位解析以及实例对象的方法和属性列表存储结构,我们能够编写更健壮、更高效的代码。