oc对象需要进行内存管理,非oc对象不需要进行内存管理,比如基本数据类型
1、堆栈区别:
- 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。若程序员不释放,则可能会引起内存泄漏。
堆都是动态分配的,没有静态分配的堆。 - 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存。
栈有两种分配方式:静态分配和动态分配.静态分配是编译器完成的,比如局部变量的分配.动态分配由alloc函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。 - 栈是吃了吐 LIFO(先进后出)
堆是吃了拉 FIFO(先进先出)
2、内存分区:
- 栈区(stack):存放函数的参数值、局部变量的值等,由编译器自动分配释放,通常在函数执行结束后就释放了,其操作方式类似数据结构中的栈。栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限,比如iOS中栈区的大小是2M。
- 堆区(heap):就是通过new、malloc、realloc分配的内存块,它们的释放编译器不去管,由我们的应用程序去释放。如果应用程序没有释放掉,操作系统会自动回收。分配方式类似于链表。
- 静态区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。
- 常量区:常量存储在这里,不允许修改的。
- 代码区:存放函数体的二进制代码。