iOS ------ 内存五大分区

1,内存的概念:

虚拟内存(Virtual Memory):虚拟内存是操作系统提供的一种机制,它使得应用程序能够访问超出物理内存限制的内存空间。虚拟内存将应用程序的内存地址空间分割成固定大小的页面(Page),并将这些页面映射到物理内存或者存储设备上的磁盘空间。

物理内存(Physical Memory):物理内存是计算机实际存在的内存硬件,也称为RAM(Random Access Memory)。它是用来存储应用程序和操作系统运行所需的数据和指令。

虚拟内存和物理内存的关系如下:

  1. 虚拟内存管理:iOS使用虚拟内存管理技术来管理应用程序的内存使用。每个应用程序都有自己的虚拟内存空间,这样每个应用程序就可以独立地访问一定范围的内存地址,而不需要担心与其他应用程序发生冲突
  2. 内存分页:iOS将虚拟内存空间划分为固定大小的页面,并使用分页技术将这些页面映射到物理内存或者存储设备上的磁盘空间。当应用程序需要访问某个页面时,操作系统将负责将该页面从磁盘加载到物理内存,并建立对应的映射关系。
  3. 虚拟内存和物理内存的映射:虚拟内存和物理内存之间存在着映射关系。虚拟内存中的页面并不一定都在物理内存中,有些页面可能被置换到磁盘上的交换空间中。当应用程序访问被置换的页面时,操作系统会将其从磁盘恢复到物理内存中,这个过程称为页面调入(Page In)

在这里插入图片描述

在iOS中,内存被分为五大区域:栈区,堆区,全局/静态区,常量区,代码区。这些有属于虚拟内存
在这里插入图片描述

2,栈区

  • 栈是一块连续的内存区域从高地址向低地址进行存储,遵循先进后出原则
  • 栈的地址空间在iOS中是以0X7开头
  • 栈区一般在运行时分配,内存空间有系统分配,声明的变量超过作用域后内存就会自动释放
  • 函数内部定义的 局部变量,方法参数(方法中默认参数:self,cmd),都存在栈区。

优缺点:

  • 优点:不会产生内存碎片,(回收释放有系统自己控制),高效的读写速度
  • 缺点:栈的内存空间较小(iOS主线程栈大小1MB,其它线程512KB),存储数据不灵活(存储内容基本固定,由编译器分配)

self和_cmd。

self:self是一个隐式参数,它代表当前方法所属的对象实例。在Objective-C中,每个对象实例在调用方法时都会自动传入self作为第一个参数。通过self,可以在方法中访问和操作当前对象的属性和方法。
_cmd:_cmd也是一个隐式参数,它代表当前方法的选择器(Selector)。选择器是Objective-C中用于唯一标识方法的一种机制,它包含方法名和参数类型信息。在方法内部,可以使用_cmd来获取当前方法的选择器,从而进行一些运行时的操作,比如动态调用其他方法。

- (void)testStack {int a = 10;NSLog(@"a == %p",&a);NSLog(@"方法参数 self:%p",&self);NSLog(@"方法参数 cmd:%p",&_cmd);
}打印结果:
a == 0x7ffeee47d75c
方法参数 self0x7ffeee47d768
方法参数 cmd:0x7ffeee47d760

3,堆区

  • 堆是不连续的内存空间从低地址像高地址进行存储,类似于链表结构(便于增删,不便于查询)遵循先进先出原则
  • 堆的地址空间在iOS中是以0X6开头,其空间分配是动态的
  • OC中使用alloc或者new,block或者copy创建的对象都会存在这里。ARC下编译器会自动在合适的时候释放内存,而在MRC下需要开发者手动释放
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。
  • 开发人员一般要关注变量的生命周期,如果不及时释放,会造成内存泄漏,只有等程序结束时有系统统一回收。

优缺点:

  • 优点:获得空间灵活,分配内存较大
  • 内存需要手动管理,容易产生碎片,读取速度比栈区慢

访问堆区内存时,一般先通过对象读取到对象所在栈区的指针地址,然后通过指针地址访问堆区。

- (void)testHeap {NSObject *object1 = [NSObject new];NSObject *object2 = [NSObject new];NSLog(@"object1 = %@",object1);NSLog(@"object2 = %@",object2);
}打印结果:
object1 = <NSObject: 0x600002b8f430>
object2 = <NSObject: 0x600002b8f420>

4,全局/静态区

  • 该区是在编译时分配的内存空间,在iOS中一般一0X1开头,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放
  • 为初始化的全局变量和静态变量,即BSS区(.bss)
  • 已初始化的全局变量和静态变量,即数据区(.data)

其中,全局变量是指变量值可以在运行时被动态修改,而静态变量是static修饰的变量,包含静态局部变量和静态全局变量

static修饰的变量仅执行一次,生命周期为整个程序运行期

int clB = 10;
static int bssB = 10;- (void)test {NSLog(@"clA == %p",&clA);NSLog(@"clB == %p",&clB);
}打印结果:
clA == 0x104131424
clB == 0x104131408

5,常量区

  • 常量区是编译时分配的内存空间,在程序结束后由系统释放。
  • 主要存放已经使用了的,且没有指向的字符串常量
  • 存放常量(整型,字符型,浮点,字符串等),整个程序运行期不能改变
  • 空间由系统管理,生命周期为整个程序运行期
- (void)test {NSString * name = @"HT";NSLog(@"NSString name -> 内存地址: %p", name); // 【字符串内容】 存放在常量区
}
输出:NSString name -> 内存地址: 0x1007d4118

6,代码区

  • 代码区是编译时分配主要用于存放程序运行时的代码,代码会被编译成二进制存进内存的代码区。
  • 在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。(编译期将代码转换为CPU指令)

7,函数栈

  • 函数栈有称栈区,在内存中从高地址往低地址分配
  • 栈帧是指函数运行中且未完成时占用的一块独立连续的内存区域
  • 应用中新创建的每个线程都有知己专有的栈空间,栈可以在线程期间自由中使用。而线程中有大量的函数调用,这些函数共享线程这个栈空间。每个函数所使用的栈空间是一个栈帧,所有栈帧就构成了这个线程完整的栈
  • 函数调用发生在栈上的,每个函数的相关信息(例如局部变量,调用记录)都存储在一个栈帧,每次执行一次函数调用,就会生成一个与其相关的栈帧,然后将栈帧压入函数栈。当函数执行结束,则将此函数的栈帧出栈并释放。

栈堆溢出:
一般情况下应用程序是不需要考虑堆和栈的大小的,但是事实上堆和栈都不是无上限的,过多的递归会导致栈溢出过多的alloc变量会导致堆溢出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由策略与路由控制

1.路由控制工具 匹配工具1&#xff1a;访问控制列表 &#xff08;1&#xff09;通配符 当进行IP地址匹配的时候&#xff0c;后面会跟着32位掩码位&#xff0c;这32位称为通配符。 通配符&#xff0c;也是点分十进制格式&#xff0c;换算成二进制后&#xff0c;“0”表示“匹配…

【软考】模拟考卷错题本2024-05-07

1 项目路径 这里的图没有加载出来&#xff0c;没u哦i关系了。其实主要是的算出最长的路径中包含那些元素即可。这里是蒙圈了&#xff0c;没有考虑到还有更长的。要顾头也顾尾。 2 算法分析-贪心 该问题主要考核的是算法设计策略来达到目标的方式。主要的设计策略有&#xff1a;…

Linux变量的认识及环境变量配置详解

文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1&#xff09;配置方法一&#xff1a;~/.bashrc文件2&#xff09;配置方法二&#xff1a;~/.profile文件3&#xff09;配置方法三&#xff…

CTF-reverse二维四向迷宫路径求解

二维四向迷宫是一个re中的常考点&#xff0c;说不上难&#xff0c;但也不简单&#xff0c;本篇记录了常规的二维四向迷宫解题套路以及帮助快速解题的脚本 可能你看我的教程会觉得十分繁琐&#xff0c;但实际只要你用了一次熟练之后&#xff0c;基本都是拿到迷宫就一题一分钟解决…

jmeter控制器讲解

1&#xff0c;随机顺序控制器和随机控制器的区别&#xff1a;随机顺序控制器下所有的接口都会执行&#xff0c;只是执行顺序是随机的&#xff0c;随机控制器下所有的接口中随机执行一个接口&#xff0c;其余接口不执行。

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊&#xff0c;一种全新的购物平台——TikTok商城&#xff0c;正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中&#xff0c;了解如何有效利用TikTok Shop的各项功能&#xff0c;理解其独特的运营模式&…

Linux进程——Linux进程间切换与命令行参数

前言&#xff1a;在上一篇了解完进程状态后&#xff0c;我们简单了解了进程优先级&#xff0c;然后遗留了一点内容&#xff0c;本篇我们就来研究进程间的切换&#xff0c;来理解上篇提到的并发。如果对进程优先级还有没理解的地方可以先阅读&#xff1a; Linux进程优先级 本篇…

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

C++之大数运算

溪云初起日沉阁 山雨欲来风满楼 契子✨ 我们知道数据类型皆有范围&#xff0c;一旦超出了这个范围就会造成溢出问题 今天说说我们常见的数据类型范围&#xff1a; 我们平时写代码也会遇到数据类型范围溢出问题&#xff1a; 比如 ~ 我们之前写的学生管理系统在用 int类型 填写…

stack的使用

1.栈的定义 我们可以看到模板参数里面有一个容器适配器 &#xff0c;什么是适配器&#xff1f;比如充电器就叫做电源适配器&#xff0c;用在做转换&#xff0c;对电压进行相关的转换适配我们的设备。栈&#xff0c;队列不是自己直接管理数据&#xff0c;是让其他容器管理数据&a…

java-函数式编程-语法

目录 1、函数表现形式 分类 lambda表达式 参数类型可以全写&#xff0c;也可以全不写&#xff0c;但不能一部分写&#xff0c;一部分不写lambda 的省略策略&#xff1a;凡是可推导&#xff0c;都可以省略 方法引用 练习-判断语法正确性 练习-写出与方法引用等价的lambda表达式…

新火种AI|马斯克聘用OpenAI泄密者,他们的梁子着实越结越深...

作者&#xff1a;小岩 编辑&#xff1a;彩云 就在最近&#xff0c;昔日就职于OpenAI的工程师Pavel Izmailov正式加入了马斯克的AI团队&#xff0c;他还在自己的推特上大张旗鼓的做着宣传&#xff1a;研究院xai。 AI工程师的跳槽本不值得惊讶&#xff0c;但Pavel的跳槽却在行…

LSTM神经网络 vs Transformer在量化中的应用

LSTM,全称Long Short-Term Memory,是一种特殊的递归神经网络。它通过巧妙的"门"结构,可以有效地捕捉时间序列数据中的长期依赖关系。这一特点,使得LSTM在处理股价这种具有时间序列特性的数据时,展现出了非凡的潜力。 这种特殊的递归神经网络 与一般的前馈神经网络不…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类&#xff0c;实现它的拷贝构造并重载赋值运算符。 class T…

盘点四种计算数组中元素值为1的个数的方法

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;使用内置函数sum和生成器表达式 五、方法四&#xff1a;使用NumPy库 六、性能比较 七、性能结果分析与讨论 八、最佳实践 九、总结 一、引言 在编程和数…

银河麒麟QT项目打包详细教程

银河麒麟QT项目打包详细教程 一、QT项目打包 下载linuxdeployqt&#xff0c;下载地址&#xff1a;https://github.com/probonopd/linuxdeployqt/releases 安装Linuxdeployqt 2.1 为了安装方便&#xff0c;将下载下来的文件名称改短些 mv linuxdeployqt-6-x86_64.AppImage lin…

92、动态规划-最小路径和

思路&#xff1a; 还是一样&#xff0c;先使用递归来接&#xff0c;无非是向右和向下&#xff0c;然后得到两种方式进行比较&#xff0c;代码如下&#xff1a; public int minPathSum(int[][] grid) {return calculate(grid, 0, 0);}private int calculate(int[][] grid, int …

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

Vmware虚拟机瘦身及Samba服务不可用问题解决

虚拟机磁盘空间膨胀是一个令人头疼的问题&#xff0c;特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发&#xff0c;都面临着这个难题。首先&#xff0c;操作系统本身就已占用不少空间&#xff0c;更新安装包&#xff0c;再下载一些开源软件&#xff0c;剩…

运行Spring Boot项目失败?显示java: 无法访问org.springframework.boot.SpringApplication,让我来看看~

idea项目运行报错截图&#xff1a; &#xff08;1&#xff09;查看错误提示“类文件具有错误的版本 61.0, 应为 52.0”&#xff0c;61.0对应的是jdk17&#xff0c;52.0对应1.8。 通过这个网址可以查询版本&#xff1a; https://stackoverflow.com/questions/9170832/list-of-ja…