iOS 底层学习之探秘 OC 对象的本质与 isa
2023-09-22 17:59:48
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 对象有了更深入的了解。