NSObject +alloc做了什么?
2024-01-07 02:38:11
+alloc方法概述
在Objective-C中,+alloc方法是类方法,用于创建新对象的实例。它为新对象分配内存,并返回指向该对象的指针。+alloc方法是Objective-C内存管理的基石,因为它为创建新对象提供了统一的接口,而不管对象的类型如何。
+alloc方法的实现
+alloc方法的实现隐藏在Objective-C运行时库中,但我们可以通过查看其汇编代码来了解其内部工作原理。在x86-64架构上,+alloc方法的汇编代码如下:
callq objc_alloc
retq
从汇编代码中,我们可以看到+alloc方法实际上只是调用了objc_alloc函数。objc_alloc函数是Objective-C运行时库中的一个底层函数,用于为新对象分配内存。objc_alloc函数的原型如下:
id objc_alloc(Class cls);
objc_alloc函数接受一个Class类型参数,该参数指定要创建的对象的类。objc_alloc函数为新对象分配内存,并返回指向该对象的指针。
class_createInstance函数
在objc_alloc函数内部,它调用了class_createInstance函数来创建新对象的实例。class_createInstance函数的原型如下:
id class_createInstance(Class cls, size_t extraBytes);
class_createInstance函数接受两个参数:
- Class cls:要创建的对象的类。
- size_t extraBytes:要分配给新对象的额外字节数。
class_createInstance函数为新对象分配内存,并返回指向该对象的指针。如果extraBytes参数大于0,则class_createInstance函数将在新对象之后分配额外的字节数。这通常用于在对象中存储附加数据。
instanceSize函数
在objc_alloc函数内部,它还调用了instanceSize函数来计算新对象的实例大小。instanceSize函数的原型如下:
size_t instanceSize(Class cls);
instanceSize函数接受一个Class类型参数,该参数指定要计算实例大小的类。instanceSize函数返回该类的实例大小。实例大小是指对象在内存中占用的字节数。
InitIsa函数
在objc_alloc函数内部,它还调用了InitIsa函数来初始化新对象的isa指针。InitIsa函数的原型如下:
void InitIsa(id obj);
InitIsa函数接受一个id类型参数,该参数指定要初始化其isa指针的对象。InitIsa函数将对象的isa指针初始化为其类的元类指针。元类是类的类,它包含有关类的信息。
结论
通过对NSObject的+alloc方法的内部工作原理进行深入探讨,我们了解了+alloc方法如何与objc_alloc、class_createInstance、instanceSize和InitIsa等底层函数交互,以创建和初始化对象。这些基本概念对于理解Objective-C的内存管理机制至关重要。掌握这些概念可以帮助您编写出更高效和健壮的代码。