iOS 进阶 - 内存管理(一) -- 内存布局

思维导图

iOS 进阶 - 内存管理(一) -- 内存布局

概述

iOS 进阶 - 内存管理(一) -- 内存布局

  • 内存布局(iOS 系统下的内存布局是什么样的?)
  • 内存管理方案(iOS操作系统是怎么对内存进行管理的?)
  • 数据结构(更好的讲述内存管理方案相关的问题,就要明白他们的数据结构)
  • ARC&MRC(什么是ARC,什么是MRC,他们的区别以及各自实现的机制、原理)
  • 引用计数机制(什么是引用计数机制?内存是怎样管理的?)
  • 弱引用表(我们声明weak的一个变量,为什么在内存释放的时候,weak指针会自动置为nil?弱引用变量内存是怎么管理的?)
  • 自动释放池(AutoReleasePool)的实现机制和原理是怎样的?
  • 循环引用(常考点和易错点,考察对内存管理理解的深度)

内存布局

iOS 进阶 - 内存管理(一) -- 内存布局地址的表示是由下到上是低地址到高地址
展示的图代表一个内存区域,内存区域分为:

  1. 内核区的内存(最上边)
  2. 保留的内存空间(最下边)
  3. 程序加载的空间(中间位置)

程序加载到内存会分成三部分:

  1. 未初始化区
  2. 已初始化区
  3. 代码段
  • 未初始化区:我们声明的未初始化的静态变量和全局变量都在未初始化数据区(.bss)中
  • 已初始化区:我们声明的已初始化的静态变量和全局变量都在已初始化数据区(.data)中
  • 代码段:我们写的程序所有的代码数据段都在代码段(.text)中
  • 栈区(stack):iOS定义的方法和函数都是在栈上工作,栈是从高地址到低地址进行扩展,所以说栈是向下扩展
  • 堆区(heap):创建的对象,或者block经过copy之后,都会被转移到堆上面,堆是向上增长的

不同内存段分别代表的详细含义:

  • stack:代表栈区,栈区一般都是方法调用会在这个内存区进行展开。
  • heap:代表堆区,通过alloc等分配的对象,实际上都是在堆上面体现的。
  • bss:未初始化的全局变量 / 静态变量
  • data:已初始化的全局变量/ 静态变量
  • text:程序代码,加载到内存后都放在text段中