文章目录

  • 五大分区
    • 栈区
    • 堆区
    • 常量区
    • 静态区
    • 代码区
  • 如何查看一个对象在堆区 / 栈区
  • 注意
  • 说到内存分区,这里的内存指的就是RAM(random access memory)。
  • 内存分为五个区:栈区(系统管理的地方)、堆区(程序员控制的地方)、静态区(全局区)、常量区、代码区

五大分区

栈区

栈是由编译器自动分配释放来管理内存。用户存放程序临时创建的变量、存放函数的参数值、局部变量等。由于栈的先进后出特点,所以特别适合用来做保存/恢复现场的操作。从这个吧意义上,我们可以把栈看做一个临时寄存、交换的内存区。

栈区(stack): 是一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。参数、函数、局部变量都放在栈区。参数入栈是从前往后入栈;而结构体入栈是从后往前入栈

  • 快速高效,但是有限制,数据不灵活。[先进后出]
  • 栈空间分配:静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配;动态分配由alloca函数完成。
  • 栈的动态分配无需释放(是自动的),也就没有释放函数。
  • 为可移植的程序起见,栈的动态分配操作是不被鼓励的!

堆区

堆区(heap): 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如变量通过newallocmallocrealloc分配的内存块就存放在堆区。

堆向高地址扩展的数据结构,是不连续的内存区域。 程序员负责在何时释放内存,在ARC程序中,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。
对于堆来讲,频繁的new/delete势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低。

  • 灵活方便,数据适应面广泛,但是效率有一定降低。[顺序随意]
  • 堆是函数库内部数据结构,不一定唯一。
  • 不同堆分配的内存无法互相操作。
  • 堆空间的分配总是动态的
  • 虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。

常量区

文字常量区: 存放常量字符串,程序结束后由系统释放

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。

静态区

全局区(静态区) (static): 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。

注意:全局区又可分为未初始化全局区(BSS段)和初始化全局区(DATA段)。

举例:

  • int a;未初始化的;.bss
  • int a = 10;已初始化的。.data

代码区

程序代码区: 用来存放函数的二进制代码。

  • 它是可执行程序在内存中的镜像。
  • 代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入操作。

如何查看一个对象在堆区 / 栈区

  1. 你初始化方法以 new, alloc, retain,copy 开头都是在堆区,也包括被引用计数管理的对象。常量这些就会在栈区。
    简单一点,除去 NSString *aString = @"aaa" 这种编译时会转换为常量其它的 Objective-C 对象,理论上来说,都是在堆区。此外,block 也是个例外,具体的可以去了解内存管理相关的知识点。
  2. 如果是在方法执行过程当中,定义在本地的原生类型(或者说值类型)。那么肯定它是在栈上。当函数执行结束时直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理
  3. 一般情况下你可以打印出地址,判断他是在堆还是栈内存中,栈是高地址往下,堆是低地址往上,一般看到0x7fff....这种的肯定是是在栈中的,要注意一点的是TEXT段,像NSString这种基本放在TEXT段中,这种地址比堆地址更低,也很好区分;你可以去看一下内存是怎么划分的;

注意

  • 当一个 app 启动后,代码区、常量区、全局区大小就已经固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)
  • 在 iOS 中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的

【iOS】内存五大分区相关推荐

  1. iOS内存分配与五大区域

    目录: 参考的博客: iOS内存的五大区域 : 栈区(stack) 堆区(heap): 全局区(又称静态区)(static): 文字常量区: 程序代码区: Allocations模版: 虚拟内存简介: ...

  2. 【iOS】—— 内存的五大分区

    平时我们编写程序的时候可能不太在意系统的内存问题,那么我们所编写代码变量都是怎么在内存中存取的呢?内存其实分为五大分区,栈区(系统管理的地方).堆区(程序员控制的地方).常量区(全局区).静态区和代码 ...

  3. iOS——内存分配与分区

    这篇文章依次介绍一下iOS中内存的分配与分区. 1.RAM & ROM 存储器(Memory)是计算机系统中的记忆设备,用来存放程序和数据. iOS的存储器包括RAM(random acces ...

  4. C语言学习笔记:内存的五大分区

    在C语言中,进程可在内存中分别存入五大分区: 1.text:也称为代码段,其中主要用于存放二进制指令.常量.被const修饰过的初始化过的全                      局变量.静态局部 ...

  5. iOS内存扫描工具实现

    由于不能告诉你的原因,我需要一个iOS下的,可以在指定App的内存中搜索字符串的工具. 找了一圈,发现一个比较接近的开源项目:rxmemscan,但是不支持搜索字符串,遂 修改 学习了一番. 又,修改 ...

  6. Objective-C runtime机制(5)——iOS 内存管理

    概述 当我们创建一个对象时: SWHunter *hunter = [[SWHunter alloc] init]; 上面这行代码在栈上创建了hunter指针,并在堆上创建了一个SWHunter对象. ...

  7. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  8. iOS内存缓存和磁盘缓存的区别

    缓存分为内存缓存和磁盘缓存两种,其中内存是指当前程序的运行空间,缓存速度快容量小,是临时存储文件用的,供CPU直接读取,比如说打开一个程序,他是在内存中存储,关闭程序后内存就又回到原来的空闲空间:磁盘 ...

  9. 【iOS开发】—— iOS内存管理

    文章目录 1. iOS内存分配区域 1.1 栈区 1.2 堆区 1.3 常量区 1.4 全局区/静态区 1.4.1 static静态变量 1.4.2 extern全局变量 1.5 代码区 2. iOS ...

最新文章

  1. 决策智能(Decision Intelligence)二三事
  2. Oracle ADG vs DG
  3. Lucene 中的Tokenizer, TokenFilter学习
  4. 卡顿严重_王者峡谷:S20出现bug?卡顿十分严重
  5. 【案例】RAID卡写策略改变引发的问题
  6. 20100412 最近在看加密解密
  7. 苹果开发(二) 申请应用
  8. kafka mysql事务_【干货】Kafka 事务特性分析
  9. 【牛客 - 317B】小a与204(贪心,构造,水题)
  10. 计算机网络的自我介绍和评价,计算机网络自我介绍范文
  11. jsp iframe嵌入php,jsp中的iframe什么意思
  12. 拼多多董事会变更:董事6人变5人 张震不再出任
  13. 联想杨元庆:没必要做操作系统和芯片;华为Mate 20 Pro被迫退出安卓 Q Beta;GitHub推赚钱新利器 | 极客头条...
  14. lightGBM用于排序(Learning to Rank )
  15. 【Matlab学习笔记】【图像滤波去噪】以-4,-8为中心的拉普拉斯滤波器
  16. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理...
  17. Centos系统修改远程端口
  18. XML的四种解析方式
  19. 结构体所占内存的字节数如何计算?
  20. JAVA医院预约挂号系统毕业设计 开题报告

热门文章

  1. 12位串行AD转换器TLC2543与单片机的接口设计与编程
  2. MIoU(均交并比)的计算
  3. java百度天气接口解析_Java调用天气接口(百度天气)解析返回的JSON数据
  4. 当时我就哭了!中国首个火星探测器天问一号发射成功!
  5. Informix 12.10版本新特性-2
  6. 1080i/p-HDTV
  7. his系统服务器选择,我院完成HIS服务器及数据库的升级改造
  8. 【Gitlab】配置、运行Gitlab容器实例及简单使用测试
  9. 计算机应用说课稿,中职计算机说课稿
  10. epub电子书如何用Windows电脑打开?