返回

深入剖析 OC 对象的创建原理(上)

IOS

引言:OC 对象的起源

在计算机科学领域,对象作为程序设计的基础单元,发挥着至关重要的作用。在 Objective-C 中,对象也不例外,它是程序中数据的抽象表示,封装了数据和行为。当我们使用 OC 对象时,幕后会发生一系列复杂的过程,其中最核心的就是对象创建。

alloc:内存分配的序曲

对象创建的序曲从 alloc 方法开始,它负责为即将创建的对象分配内存空间。alloc 方法的语法非常简洁:

- (instancetype)alloc

不要被 alloc 方法的简洁外表所迷惑,它的内部机制却异常复杂。它需要确定对象的大小,在内存中找到合适的空间,并返回指向这块内存的指针。

内存分配的探秘

为了解开 alloc 方法的内存分配之谜,我们需要深入底层源码。在 Objective-C 运行时中,alloc 方法的实现如下:

id objc_alloc(Class cls) {
    size_t size = class_getInstanceSize(cls);
    id obj = malloc(size);
    obj->isa = cls;
    return obj;
}

从这段代码中,我们可以看到 alloc 方法首先通过 class_getInstanceSize 函数确定对象的大小,然后使用 malloc 函数分配相应大小的内存。随后,它将对象的 isa 指针指向其所属的类,完成对象的内存分配。

指针与内存的交响曲

在对象创建过程中,指针扮演着至关重要的角色。在 alloc 方法中,返回的 id 类型实际上是一个指向对象的指针,它标识了对象在内存中的位置。对象的 isa 指针同样指向一个内存地址,指向该对象的类符,后者包含了对象的元数据信息。

深入源码:揭开 alloc 的面纱

要深入理解 alloc 方法的运作方式,我们可以采取以下步骤:

  • 方式一:调试内存分配 使用 LLDB 等调试器,在 alloc 方法的调用点设置断点,观察内存分配的情况,包括分配的大小和位置。
  • 方式二:覆盖 alloc 方法 通过运行时 API,覆盖 alloc 方法,并添加日志记录代码,以便跟踪内存分配过程。
  • 方式三:使用工具库 诸如 Allocations 库等工具可以帮助可视化和分析内存分配,包括 alloc 方法的调用情况。

结语

通过探索 alloc 方法的底层源码,我们揭开了 OC 对象创建的序幕。在 subsequent 部分,我们将深入研究对象的初始化过程,了解如何将数据和行为注入刚创建的对象中,从而完成对象的创建。