返回

探寻 alloc 的本质,揭秘 OC 对象创建的奥秘

IOS

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 对象的创建过程:

  1. 调用 alloc 为对象分配内存空间。
  2. Runtime 根据元类信息确定对象的内存布局。
  3. Runtime 返回一个指向分配空间的指针,即对象指针。
  4. 使用对象指针对对象的实例变量进行初始化。

深入探索

本文只是对 alloc 底层原理的初步探索,后续文章将深入探讨以下主题:

  • isa 指针的更多细节
  • class 指针的作用
  • 引用计数内存管理机制
  • 类的注册和加载过程

通过这些深入的探索,你将对 OC 对象创建和内存管理机制有一个更加全面的理解。