iOS底层原理之内存五大区

1,427 阅读3分钟

在iOS中,内存主要分为:栈区堆区全局区(静态区)常量区以及代码区等五大区,本文主要分析这五大区。

栈区分析

什么是栈

  • 栈是系统数据结构,其对应的线程或进程是唯一的
  • 栈是从高地址向低地址扩展的数据结构
  • 栈是一块连续的内存区域,遵循先进后出原则
  • 栈的地址空间是以0x7开头
  • 栈是在运行时开辟

栈的存储

  • 栈是由编译器自动创建和释放的
  • 存储局部变量,一旦离开作用于就会销毁释放
  • 存储函数参数,包括隐藏函数,比如(id self, SEL _cmd)

栈的优缺点

  • 优点:由于是编译器自动创建和释放的,所以不会产生内存碎片一块连续的内存区域,所以查找速度快
  • 缺点:由于是一块连续的内存区域,所以存储空间大小有限制
    • iOS主线程默认是1M,其他线程是512kb,实际上我们也可以通过线程的stackSpace去修改,但是成本有些大

堆区

定义

  • 堆是从低地址向高地址扩展数据
  • 堆的内存区域是不连续的,方便增、删、改,类似链表
  • 堆遵循先进先出FIFO原则
  • 堆的地址空间是以0x6开头
  • 堆一般是在运行时分配内存

特点

  • 变量通过newallocmallocrealloc生成的内存放在堆区
  • 由于是运行时开辟,且内存区域是不连续的,导致容易出现内存碎片
  • 由于iOS目前都是ARC管理内存,所以一般无需手动释放

全局区(静态区)

全局区(静态区)是编译时分配的内存区域。在iOS中一般以0x1开头,在程序运行时一直存在,直到程序结束释放空间。

  • 已初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量存放在另一块区域
  • static修饰的变量成为静态变量,该变量内存放在全局区(静态区),由程序编译时创建。
  • static可以修饰局部变量也可以修饰全局变量

常量区

常量区是一块比较特殊的存储区,常量区里面存放的是常量,常量字符串就存放在常量区。 常量区的内存在编译阶段完成分配,程序运行时会一直存在内存中,只有当程序结束后才会由操作系统释放。

代码区

存放可执行代码的二进制文件区,它在程序编译时存入,只可读不可写

总结

栈区、堆区内存空间是运行时分配的,因此随着程序运行而变化;在iOS中堆区的内存是应用程序共享的,堆区的内存分配是系统负责的。全局区(静态区)、常量区、代码区是在编译时分配,是固定的不可变的。