【iOS】-- 内存五大分区

news/2024/5/20 10:06:05

【iOS】-- 内存五大分区

  • 内存五大分区
    • 1.栈区
      • 优点:
    • 2.堆区
      • 优点:
    • 3.全局区
    • 4.常量区
    • 5.代码区
  • 验证
  • static、extern、const关键字比较
    • 1.static关键字
      • static关键字的作用:
      • 全局静态变量
      • 局部静态变量
    • 2.extern关键字
      • 对内的全局变量
      • 对外的全局变量
    • 3.const关键字

内存五大分区

内存五大分区:
栈区(系统管理的地方),堆区(程序员管理的地方),常量区,全局区(静态区),代码区。
在这里插入图片描述

1.栈区

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

优点:

  • 栈是系统数据结构,对应线程/进程是唯一的。
  • 快速高效,缺点是有限制,数据不灵活。[先进后出]
  • 栈空间分静态分配和动态分配两种。
  • 静态分配是编译器完成的,比如自动变量(auto)的分配。
  • 动态分配由alloc函数完成。
  • 栈的动态分配无需释放(是自动的),也就没有释放函数。

下面来看一个例子:

NSObject *obj = [NSObject new];

obj是一个指针变量,不是一个对象,存储在栈区,真正的创建对象,new做的事情有四步:

  1. 在堆内存中申请一块合适大小的空间。
  2. 在申请的这块空间中根据类的模板创建对象。
  3. 初始化对象的属性,为对象的属性赋默认值:
    • 如果属性的类型是基本数据类型,就赋值为0。
    • C指针类型NULL。
    • OC指针类型 nil。
  4. 返回这个对象在堆空间的地址。
    将这个地址返回赋值给obj指针,该指针指向了堆空间中的NSObject对象。

2.堆区

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

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

优点:

  • 灵活方便,数据适应面广泛,但是效率有一定降低。
  • 堆是函数库内部数据结构,不一定唯一。
  • 不同堆分配的内存无法互相操作。
  • 堆空间的分配总是动态的。

3.全局区

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

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

//举例int a; //未初始化的 .bssint a = 10; //初始化的 .data

4.常量区

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

5.代码区

程序代码区: 用来存放函数的二进制代码。
代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入操作。

验证

运行下面一段代码,看看变量在内存中是如何分配

- (void)test{NSInteger i = 123;NSLog(@"i的内存地址:%p", &i);NSString *string = @"CJL";NSLog(@"string的内存地址:%p", string);NSLog(@"&string的内存地址:%p", &string);NSObject *obj = [[NSObject alloc] init];NSLog(@"obj的内存地址:%p", obj);NSLog(@"&obj的内存地址:%p", &obj);  
}

运行结果如下:
在这里插入图片描述

  • 对于局部变量i,从地址可以看出是0x7开头,所以i存放在栈区
  • 对于字符串对象string,分别打印了string的对象地址 和 string对象的指针地址
    • string的对象地址是以0x1开头,说明是存放在常量区
    • string对象的指针地址是以0x7开头,说明是存放在栈区
  • 对于alloc创建的对象obj,分别打印了obj的对象地址 和 obj对象的指针地址(可以参考前文的汇总图)
    • obj的对象地址是以0x6开头,说明是存放在堆区
    • obj对象的指针地址是以0x7开头,说明是存放在栈区。

static、extern、const关键字比较

1.static关键字

static关键字的作用:

  1. 可以修饰局部变量,将局部变量存储到静态存储区。
  2. 可以修饰全局变量,限定全局变量只能在当前源文件中访问。
  3. 可以修饰函数,限定函数只能在当前源文件中调用。

全局静态变量

优点:无论是类方法还是实例方法都可以访问和修改全局静态变量,外部方法无法调用,供所用对象调用。
缺点:存在生命周期长,直到程序结束。

局部静态变量

优点:定义后只保存一份值,每次调用的时候,没有重新创建,节省空间,只能在该局部代码中使用。
缺点:存在生命周期长,直到程序结束,只能在该局部代码中使用。

2.extern关键字

全局变量分为两种:

对内的全局变量

优点:无论是类方法还是实例方法都可以访问和修改全局静态变量,外部方法无法调用,总所有对象使用
缺点:存在生命周期长,直到程序结束。

对外的全局变量

优点:除了该类,其他文件也可以访问该变量。
缺点:存在的生命周期长,从定义直到程序结束。并且外部可以修改其值,出现错误不容易定位。

全局静态变量与全局变量 其实本质上是没有区别的,只是存在修饰区别,一个static让其只能内部使用,一个extern让其可以外部使用。

3.const关键字

不同于变量,常量的值是固定不可变的,一般用于只读值。
优点:只可以读取值,不能修改。一般用于接口或者文字显示这种固定值。添加extern可以对外全局常量,任意位置都可以访问。
缺点:存在的生命周期长,从定义直到程序结束。需要在.h .m中分别定义代码较多。


http://www.mrgr.cn/p/77231665

相关文章

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日,备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天,真的攒足了眼球,不仅俄罗斯这边的很多媒体和自媒体有报道,展会第一天,很多参展商通过短视频平台将展会的盛况传到了国内&#…

近似消息传递算法(AMP)单测量模型(SMV)

1、算法解决问题 很多人致力于解决SLM模型的求逆问题,即知道观测值和测量矩阵(字典之类的),要求未知变量的值。SLM又叫做标准线性模型,后续又在此基础上进行升级变为广义线性模型。即SLM是yAxe,这里是线性…

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码,再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面,进入后会存下cookies值&…

22_Scala集合Seq

文章目录 Seq序列1.构建集合2.List集合元素拼接&&集合拼接3.可变Seq&&List3.1 ListBuffer创建3.2 增删改查3.3 相互转化 Appendix1.Scala起别名2.Seq底层3.关于运算符操作: :4.空集合的表示 Seq序列 –Seq表示有序,数据可重复的集合 1.构建集合 …

ReactFlow的ReactFlow实例事件传参undefined处理状态切换

1.问题 ReactFlow的ReactFlow实例有些事件我们在不同的状态下并不需要,而且有时候传参会出现其它渲染效果,比如只读状态下我们不想要拖拉拽onEdgesChange连线重连或删除的功能。 2.思路 事件名称类型默认值onEdgesChange(changes: EdgeChange[]) >…

Java面试重点之反射机制

一、 反射是什么? 允许程序在运行时查询和操作对象的类型信息。通过反射,程序能够在运行时获取对象的类定义信息,如类的名称、方法、字段、注解等,并且可以动态地调用对象的方法或访问其字段,而无需在编译时具体知道对…

【SQL每日一练】统计复旦用户8月练题情况

文章目录 题目一、分析二、题解1.使用case...when..then2.使用if 题目 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,请取出相应明细数据,对于在8月份没有练习过的用户,答题数结果返回0. 示例代码&am…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础:异步编程/单线程和异步》中讲过,Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时,⼤部分情况都是通过回调函数来进⾏。 (如果你还不了解单线程和异步的概念,可以先去回顾上一…

OpenVX技术图例(二)

OpenVX技术图例(二) 参考文献链接 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html人工智能芯片与自动驾驶

贪吃蛇小游戏(c语言)

1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 (上、下、左、右方键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…

(7)ram ip使用

一、ram相关介绍 本实验使用一个控制模块对ram ip进行控制(本质上是三个计数器) 二、ip使用 在界面中选择IP catalog,搜索block,选择底下这个,双击即可生成ram的ip下面进行一些ram资源的配置 配置好后点击ok,生成ip,可以在这里看到已经生成好了: 这里点开这个.veo文件,…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…

Crowd counting 系列NO.2—MCNN

声明:博客是用latex写的,所以直接用图片来展示吧,效果是一样的。下载资源网上都很容易搜到,如需下载资源,请留言。

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java,真的吗?唉,先把这视频干完吧。 逻辑运算符练习 x6,y6 x6,y5 x11,y6 x11,y5 z48 错了&a…

超级大转盘!(html+less+js)(结尾附代码)

超级大转盘!(结尾附代码) 网上看到有人用转盘抽奖,怀疑是不是有问题,为什么每次都中不了,能不能整个转盘自己想中啥中啥,查阅了网上写得好的文章,果然实现了只中谢谢参与&#xff0…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能&#xff0c;控制所有I2C总线特定的时序&am…