iOS底层探索之alloc(上)—探寻内存分配背后的奥秘
2023-11-19 22:53:09
作为一名iOS开发人员,alloc是我们日常开发中接触最多的函数之一。虽然我们知道alloc的作用是为对象开辟内存空间,但对于其背后的原理和实现却往往知之甚少。本文将带领读者深入objc的源码,探索alloc背后的逻辑和实现,揭开iOS内存管理的神秘面纱。
一、alloc的概述
alloc是一个函数,用于向操作系统请求一段内存空间,并返回指向该内存空间的指针。这段内存空间将被用来存储对象的数据成员。alloc函数的声明如下:
id alloc(Class cls);
其中,cls是需要分配内存空间的类的类名。例如,如果我们要为一个名为Person的类分配内存空间,则可以调用以下代码:
Person *person = [Person alloc];
这将创建一个指向Person类的实例的指针person。该实例将被存储在由alloc函数分配的内存空间中。
二、alloc的实现
alloc函数的实现位于objc的源码中。我们可以通过以下命令查看alloc函数的源码:
$ open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/include/objc/runtime.h
在runtime.h文件中,我们可以找到alloc函数的声明和实现。alloc函数的实现如下:
id alloc(Class cls) {
return objc_allocateClassPair(cls, nil, 0);
}
从alloc函数的实现中我们可以看出,alloc函数实际上是调用了objc_allocateClassPair函数来分配内存空间。objc_allocateClassPair函数的声明如下:
id objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes);
其中,superclass是要分配内存空间的类的父类,name是要分配内存空间的类的类名,extraBytes是要分配的额外内存空间的大小。
当objc_allocateClassPair函数被调用时,它将创建一个新的类,并将该类添加到objc的类表中。然后,objc_allocateClassPair函数将返回一个指向该新类的指针。这个指针就是我们前面提到的person指针。
三、alloc的应用
alloc函数是iOS开发中非常重要的一个函数。它被用来为对象分配内存空间,并返回指向该内存空间的指针。这个指针可以被用来访问对象的数据成员,并调用对象的方法。
alloc函数的应用非常广泛。它可以被用来创建新的对象,也可以被用来获取现有对象的指针。例如,我们可以使用alloc函数来创建以下对象:
Person *person = [Person alloc];
NSArray *array = [NSArray alloc];
NSDictionary *dictionary = [NSDictionary alloc];
我们还可以使用alloc函数来获取现有对象的指针。例如,我们可以使用alloc函数来获取当前应用程序的委托对象:
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
四、总结
alloc函数是iOS开发中非常重要的一个函数。它被用来为对象分配内存空间,并返回指向该内存空间的指针。这个指针可以被用来访问对象的数据成员,并调用对象的方法。alloc函数的应用非常广泛,它可以被用来创建新的对象,也可以被用来获取现有对象的指针。