返回

架构底层的神奇之处——NSObject中的alloc源码分析

IOS

前言

在上一篇文章中,我们分析了 alloc 的源码。在本文中,我们将继续探索为什么 NSObject 中的 alloc 方法不走源码工程。

深入剖析

继续执行代码,我们会发现 alloc 方法首先调用一个名为 class_createInstance 函数。这个函数负责创建一个新对象并将其初始化为一个默认状态。

id class_createInstance(Class cls, size_t extraBytes)
{
    size_t instanceSize = class_getInstanceSize(cls);
    id instance = malloc(instanceSize + extraBytes);
    bzero(instance, instanceSize + extraBytes);
    return instance;
}

class_createInstance 函数首先计算出新对象的实例大小,然后使用 malloc 函数分配内存。最后,它将分配的内存清零并返回新对象的地址。

值得注意的是,class_createInstance 函数并没有调用我们之前分析过的 allocWithZone 函数。这是因为 NSObject 是一个特殊类,它不属于任何一个 zone。因此,它不能使用 allocWithZone 函数来分配内存。

设计决策的原因

那么,为什么 NSObject 中的 alloc 方法不走源码工程呢?这是因为 NSObject 是一个特殊类,它需要特殊的处理。

首先,NSObject 是所有其他类的父类。这意味着它必须能够为任何类型的对象分配内存。如果 NSObject 使用 allocWithZone 函数来分配内存,那么它就必须知道要分配的内存大小。但是,这并不是总是可能的。例如,当我们创建一个自定义类时,我们可能不知道这个类有多少个实例变量。

其次,NSObject 需要能够在没有 zone 的情况下分配内存。这是因为 NSObject 有时候需要在应用程序启动之前创建对象。在应用程序启动之前,zone 还没有被创建。因此,NSObject 必须能够在没有 zone 的情况下分配内存。

结语

NSObject 中的 alloc 方法不走源码工程,这是因为 NSObject 是一个特殊类,它需要特殊的处理。NSObject 需要能够为任何类型的对象分配内存,并且它需要能够在没有 zone 的情况下分配内存。因此,它不能使用 allocWithZone 函数来分配内存。

以上就是为什么 NSObject 中的 alloc 方法不走源码工程的原因。希望本文对您有所帮助。如果您有任何问题,请随时提出。