返回

iOS 底层学习之探秘 OC 对象的本质与 isa

IOS

iOS 开发中,OC 对象是构建程序的基础。要想深入理解 OC 对象,就需要从其本质入手,也就是从 isa 指针开始。本文将深入分析 OC 对象的本质,剖析 isa 的含义,并使用 clang 工具探索对象的底层结构。

1. OC 对象的本质

OC 对象本质上是一个由数据结构和方法实现组成的实体。数据结构负责存储对象的状态,而方法实现则负责定义对象的行为。当我们创建一个 OC 对象时,系统会为它分配一块内存空间,并将这个内存地址存储在 isa 指针中。

2. isa 指针

isa 指针是一个指向对象类对象的指针。类对象包含了对象的所有元数据,包括对象的类型、大小、实例变量列表、方法实现列表等信息。当我们调用对象的方法时,系统会通过 isa 指针找到对应的类对象,然后从类对象中找到相应的方法实现。

3. isa_t 联合体

isa_t 联合体是 OC 对象 isa 指针的数据类型。它定义了两个位域:

  • isa: 这是一个指向类对象的指针。
  • nonpointer_isa: 这是一个指向非指针对象的指针。

在 64 位系统中,isa_t 联合体的两个位域都是 64 位的。而在 32 位系统中,isa_t 联合体的两个位域都是 32 位的。

4. 类对象

类对象是 OC 类的元数据对象。它包含了该类的所有信息,包括类的类型、大小、实例变量列表、方法实现列表等。类对象存储在堆内存中,它的地址保存在 isa 指针中。

5. 对象内存布局

OC 对象的内存布局如下图所示:

+-------------------+
| isa               |
+-------------------+
| instance variables |
+-------------------+
| method cache      |
+-------------------+
| properties         |
+-------------------+
  • isa: 对象的 isa 指针,指向类对象。
  • instance variables: 对象的实例变量,存储对象的状态。
  • method cache: 对象的方法缓存,存储最近调用的方法实现,以提高方法调用的效率。
  • properties: 对象的属性,存储对象的状态。

6. 探索对象的本质

为了更好地理解 OC 对象的本质,我们可以使用 clang 工具来探索对象的底层结构。clang 是一个 C 语言编译器,它可以将 C 语言代码编译成机器码。

我们可以使用 clang 工具来查看 OC 对象的内存布局。首先,我们需要创建一个 OC 对象。然后,我们可以使用 clang 工具来查看该对象的内存布局。

$ clang -c -arch arm64 -o test.o test.m
$ lldb test.o
(lldb) p [0]

输出结果如下:

(object) $0 = 0x00007ffee54de000

我们可以看到,OC 对象的内存布局与我们前面介绍的一致。

7. 总结

本文深入分析了 OC 对象的本质,剖析了 isa 指针的含义,并使用 clang 工具探索了对象的底层结构。通过本文的学习,相信大家对 OC 对象有了更深入的了解。