objective-c 对象所占内存总是分配在“堆空间” (为什么存放在堆中而不是栈中),并且堆内存是由你释放的,即release。
栈是由编译器管理自动释放的,在方法中(函数体)定义的变量通常在栈内。
分配方式:
对于栈来说,是由编译器来自动分配释放的,无需我们手动操控。存放函数的参数值,局部变量等。
对于堆来说,分配和释放工作是由程序员控制,容易产生内存泄漏(memory leak)。
栈是一个用来存储局部和临时变量的存储空间。在现在操作系统里面,一个线程会分配一个栈。当一个函数被调用的时候,一个栈帧会压到栈里,里面包含了这个函数涉及的参数,局部变量,返回地址等相关信息。当函数返回的后,这个栈帧会被销毁。栈对象的生命周期仅限于其所在的块里,出了块就立马被释放。一切都是自动的、无需自己调度。
堆,从本质来说,程序所有都在内存中(有些东西是不在堆栈中的,但在这篇文章中我们不作讨论)。在堆上,我们可以任何时候分配内存空间和释放销毁它,如果你不使用垃圾回收机制,你必须显示的去释放它。这就是在你的函数调用前需要完成的事情。简单来说,就是alloc与release。
NSObject *obj = [[NSObject alloc] init];
系统会在栈上存储obj这个指针变量,它所指的对象在堆中。
通过[NSObject alloc]系统会为其在堆中开辟一块内存空间,并为其生成NSObject所需内存结构布局。
最后借用网上有个有个很经典的例子:
使用栈就像是我们去饭馆里吃霸王餐,只管点菜(发出申请),吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作。好处是快捷,但是自由度比较小,人家做成什么样的菜你就吃什么样的。
使用堆就像是自己动手买菜,做菜,刷锅,洗碗。比较麻烦,但是自由度比较大
网友评论