在操作系统中,会把内存分为几个区,每个区有自己不同的作用和特点,当程序开始运行的时候,操作系统首先会把物理硬盘中的二进制代码加载到内存中,再把代码根据不同的系统语言分成几个区,然后找到程序的main函数入口,开始一行一行代码的执行下去。
在iOS中,通常会把内存分为5个区域栈区、堆区、BBS区、常量区和代码区。
栈区
栈区是由系统来控制和分配的区域,是一种后进先出(LIFO)的结构,一般情况下栈顶的地址和栈的最大容量是由系统预先设定好的,栈是逆向生长的,所以先进栈的所分配的内存空间地址一般更大一些。
存储类型
栈区一般用来存储iOS中的基本数据类型,比如int、float等等。这些类型的局部变量都是放在栈区里的。
特点
优点:快速高效,无需程序员管理内存。
缺点:数据有限制,且生存期必须是确定的。
分配方式
静态分配:由编译器完成。
动态分配:由alloc完成,由系统自动管理。
堆区
堆区是由程序员自己来分配的内存空间,如果程序员不手动释放空间,则会发生内存泄漏,iOS中程序员通过引用计数的方式管理堆空间。是一种先进先出(FIFO)的结构,是一块不连续的数据区域,堆的最大内存容量可以达到计算机的可分配内存大小,堆是顺序生长的,所以先进堆的锁分配的内存空间地址更小一些。
存储类型
堆区一般用来存储iOS中的对象,比如NSString、NSDictionary等。
特点
优点:获得空间灵活,可使用空间较大。
缺点:容易产生碎片,效率较低。
分配方式
动态分配:由alloc完成,由程序员手动管理内存。
BSS段
BSS段通常用来存放未初始化的全局变量和静态变量,比如 int a;
。
可读写,在程序开始之前会将数据清零。
在程序退出后释放。
数据区
数据库用来存储已经初始化过的全局变量和静态变量以及字符串常量。比如 int a = 10;
。
代码区
用于存放已经编译过的二进制代码。