返回

探秘 OC 对象创建的 alloc 流程:深入源码,揭秘内存开辟奥秘

IOS

作为一门面向对象的语言,Objective-C 的对象创建机制至关重要。而 alloc 作为开辟对象内存空间的关键方法,其内部运作原理一直备受开发者关注。本文将带你深入 Objective-C 的源码,一步步揭秘 alloc 的流程,为你揭开对象创建的幕后奥秘。

一、源码定位

探索 alloc 流程之前,我们需要一份最新的 Objective-C 官方源码。本文使用的是 objc4-781 版本。

二、alloc 的定义

在源码中,alloc 方法被定义在 objc/runtime.h 头文件中:

id objc_alloc(Class cls);

其中:

  • objc_alloc:alloc 方法的函数名。
  • Class:待创建对象的类对象。

三、alloc 的实现

objc/runtime/objc-alloc.mm 源码文件中,我们找到了 alloc 的实现:

id objc_alloc(Class cls) {
  ...
  instance = objc_allocate_instance(cls, cls->instanceSize);
  ...
}

alloc 的实现主要分两步:

  1. 调用 objc_allocate_instance 分配对象所需的内存空间。
  2. 将分配的内存空间返回,并类型转换为 id 类型。

四、objc_allocate_instance

objc_allocate_instance 方法在 objc/runtime/objc-instance.mm 源码文件中:

id objc_allocate_instance(Class cls, size_t size) {
  ...
  instance = malloc(size);
  ...
}

其中:

  • objc_allocate_instance:分配对象内存的方法。
  • cls:待创建对象的类对象。
  • size:待创建对象的实例大小。

objc_allocate_instance 调用 malloc 分配对象所需的内存空间,并返回分配的内存地址。

五、内存开辟过程

  1. 确定对象大小 :alloc 根据类对象的 instanceSize 字段确定待创建对象的实例大小。该字段存储了对象实例的实际大小,包括对象头和所有实例变量的大小。
  2. 分配内存 :objc_allocate_instance 调用 malloc 分配指定大小的内存块。malloc 将从堆内存中分配一块连续的内存区域,并返回该区域的起始地址。
  3. 设置对象头 :分配的内存块中包含一个对象头,存储对象类的元数据信息,例如对象的类型、类对象指针和引用计数。alloc 将这些信息写入对象头。
  4. 返回对象实例 :alloc 将分配的内存地址类型转换为 id 类型,并返回对象实例。

六、总结

alloc 是 Objective-C 中创建对象的关键方法。它通过以下步骤开辟对象所需的内存空间:

  1. 确定对象大小。
  2. 分配内存。
  3. 设置对象头。
  4. 返回对象实例。

通过深入源码,我们揭示了 alloc 流程的奥秘,理解了对象创建时内存开辟的机制。这有助于我们更深入地理解 Objective-C 的底层原理,并编写出更高效、更可靠的代码。