返回
探寻 alloc 的本质,揭秘 OC 对象创建的奥秘
IOS
2023-11-20 14:56:59
OC底层原理初探之对象的本质(一)alloc探索上
在 Objective-C 中,创建对象的过程离不开 alloc
方法。alloc
作为对象创建的基石,其底层原理蕴含着 OC 内存管理的奥秘。本文将带你深入探索 alloc
的本质,揭开 OC 对象创建的神秘面纱。
对象、指针与地址
在进行深入分析之前,我们先来做个小测试:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"对象的内容:%@", obj);
NSLog(@"对象的地址:%p", obj);
NSLog(@"对象指针的地址:%p", &obj);
运行这段代码,你会得到以下输出:
对象的内容:<NSObject: 0x7f8084f53000>
对象的地址:0x7f8084f53000
对象指针的地址:0x7ffeec1966d0
输出中,对象的内容
指明了对象的地址,而对象的地址
和对象指针的地址
一致,都指向同一个内存地址。这说明了对象指针实际上指向对象本身。
alloc 的职责
alloc
方法的职责很简单,就是为对象分配内存空间。但这个过程涉及到一些底层的内存管理机制。在 OC 中,对象是由 Objective-C Runtime 创建和管理的。Runtime 会为每个类维护一个指向元类的指针,即 class
指针。元类是类的类,它存储着类的元信息,包括对象的布局信息。
当调用 alloc
时,Runtime 会根据 class
指针指向的元类信息,为对象分配足够的空间。分配的内存空间大小取决于对象的实例变量布局。分配完成后,Runtime 会返回一个指向分配空间的指针,即对象的指针。
内存布局
对象的内存布局遵循以下结构:
| isa 指针 | 实例变量 1 | 实例变量 2 | ... | 实例变量 n |
- isa 指针: isa 指针指向对象的元类,它用于识别对象的类型。
- 实例变量: 实例变量存储着对象的具体数据。
对象的创建过程
结合以上知识,我们可以总结一下 OC 对象的创建过程:
- 调用
alloc
为对象分配内存空间。 - Runtime 根据元类信息确定对象的内存布局。
- Runtime 返回一个指向分配空间的指针,即对象指针。
- 使用对象指针对对象的实例变量进行初始化。
深入探索
本文只是对 alloc
底层原理的初步探索,后续文章将深入探讨以下主题:
- isa 指针的更多细节
- class 指针的作用
- 引用计数内存管理机制
- 类的注册和加载过程
通过这些深入的探索,你将对 OC 对象创建和内存管理机制有一个更加全面的理解。