堆和栈的区别是什么?

首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”,OC语言是C语言的超集,因此先了解C语言的内存模型的内存管理会有很大的帮助。C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每一个区存储的内容以下:程序员

一、栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,一般在函数执行完后就释放了,其操做方式相似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,可是分配的内存量有限,好比iOS中栈区的大小是2M。编程

二、堆区:就是经过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工做,须要用程序区释放。分配方式相似于数据结构中的链表。在iOS开发中所说的“内存泄漏”说的就是堆区的内存。数据结构

三、静态区:全局变量和静态变量(在iOS中就是用static修饰的局部变量或者是全局全局变量)的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域。程序结束后,由系统释放。函数

四、常量区:常量存储在这里,不容许修改。对象

五、代码区:存放函数体的二进制代码。生命周期

 

堆和栈的区别:内存

一、堆空间的内存是动态分配的,通常存放对象,而且须要手动释放内存。固然,iOS引入了ARC(自动引用计数管理技术)以后,程序员就不须要用代码管理对象的内存了,以前MRC(手动管理内存)的时候,程序员须要手动release对象。另外,ARC只是一种中间层的技术,虽然在ARC模式下,程序员不须要像以前那么麻烦管理内存,可是须要遵循ARC技术的规范操做,好比使用属性限定符weak、strong、assigen等。所以,若是程序员没有按ARC的规则并合理的使用这些属性限定符的话,一样是会形成内存泄漏的。开发

二、栈空间的内存是由系统自动分配,通常存放局部变量,好比对象的地址等值,不须要程序员对这块内存进行管理,好比,函数中的局部变量的做用范围(生命周期)就是在调完这个函数以后就结束了。这些在系统层面都已经限定住了,程序员只须要在这种约束下进行程序编程就好,根本就没有把这块内存的管理权给到程序员,确定也就不存在让程序员管理一说。编译器

 

从申请的大小方面讲:内存管理

栈空间比较小;

堆空间比较大。

 

从数据存储方面来讲:

栈空间中通常存储基本数据类型,对象的地址;

堆空间通常存放对象自己,block的copy等。

相关文章
相关标签/搜索