返回
探秘 OC 对象创建的 alloc 流程:深入源码,揭秘内存开辟奥秘
IOS
2024-01-03 04:43:50
作为一门面向对象的语言,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 的实现主要分两步:
- 调用
objc_allocate_instance
分配对象所需的内存空间。 - 将分配的内存空间返回,并类型转换为 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 分配对象所需的内存空间,并返回分配的内存地址。
五、内存开辟过程
- 确定对象大小 :alloc 根据类对象的 instanceSize 字段确定待创建对象的实例大小。该字段存储了对象实例的实际大小,包括对象头和所有实例变量的大小。
- 分配内存 :objc_allocate_instance 调用 malloc 分配指定大小的内存块。malloc 将从堆内存中分配一块连续的内存区域,并返回该区域的起始地址。
- 设置对象头 :分配的内存块中包含一个对象头,存储对象类的元数据信息,例如对象的类型、类对象指针和引用计数。alloc 将这些信息写入对象头。
- 返回对象实例 :alloc 将分配的内存地址类型转换为 id 类型,并返回对象实例。
六、总结
alloc 是 Objective-C 中创建对象的关键方法。它通过以下步骤开辟对象所需的内存空间:
- 确定对象大小。
- 分配内存。
- 设置对象头。
- 返回对象实例。
通过深入源码,我们揭示了 alloc 流程的奥秘,理解了对象创建时内存开辟的机制。这有助于我们更深入地理解 Objective-C 的底层原理,并编写出更高效、更可靠的代码。