iOS底层之alloc详解(一)
2023-11-25 01:25:39
剖析alloc的汇编代码
为了深入了解alloc的内部机制,我们首先需要查看它的汇编代码。使用Xcode打开Objective-C项目的源代码,然后在导航栏中选择“View”->“Show Assembly”。在弹出的窗口中,搜索“alloc”即可找到相关代码。
1.1 alloc直接查看
直接查看alloc,我们能看到的是NSObject这个类,里面有alloc这个方法。但无法看到更多细节,相当于查看了.h文件。
1.2 查看alloc的实现
要查看alloc的实现,需要点击alloc方法旁边的“Jump to Definition”按钮。这将带我们进入alloc方法的实现代码。
- (instancetype)alloc {
Class isa = object_getClass(self);
instance_t result = objc_msgSend(isa, @selector(alloc));
return result;
}
从代码中可以看出,alloc方法首先调用object_getClass()函数获取当前类的类对象。类对象包含了该类的元数据信息,包括类名、父类、实例变量等。
然后,alloc方法调用objc_msgSend()函数向类对象发送alloc消息。objc_msgSend()函数是Objective-C中用于调用方法的函数。它接收三个参数:接收者对象、选择器和参数列表。在本例中,接收者对象是类对象,选择器是@selector(alloc),参数列表为空。
objc_msgSend()函数调用alloc方法后,会返回一个指向新创建的对象的指针。这个指针被存储在result变量中,并最终返回给调用者。
ARC与alloc的协同工作
在iOS中,内存管理由ARC(自动引用计数)机制负责。ARC通过跟踪对象的引用计数来决定何时释放对象。当对象的引用计数为0时,表明该对象不再被任何其他对象引用,这时ARC会自动释放该对象。
alloc函数在ARC中的作用是为新创建的对象分配内存空间。当调用alloc函数时,ARC会自动将对象的引用计数设置为1。这意味着该对象至少被一个对象引用,因此不会被释放。
当对象不再需要时,可以调用它的dealloc方法来释放它。dealloc方法会将对象的引用计数减1。如果对象的引用计数变为0,那么ARC就会自动释放该对象。
alloc与实例变量
当alloc函数创建新对象时,它还会为该对象分配实例变量空间。实例变量是存储在对象中的数据成员。它们可以是基本类型,如int、float、double等,也可以是对象类型。
实例变量的空间大小由类的实现决定。当创建新对象时,alloc函数会根据类的实现为实例变量分配空间。
结语
alloc函数是Objective-C中用于创建新对象的重要函数。它在内存管理和对象创建方面发挥着关键作用。通过深入了解alloc的内部机制,我们可以更好地理解Objective-C的内存管理机制,并编写出更加高效和可靠的代码。