【iOS内存管理-内存的几大区域】

news2024/11/24 9:55:14

前言

iOS内存管理的第一篇章,了解iOS内存的五大分区。

总览

iOS中,内存主要分为五大区域:栈区,堆区,全局区/静态区,常量区和代码区。总览图如下。请添加图片描述
如上图所示,代码区是在低地址段存放,而栈区则存放在高地址段,并且各个分区之间不是连续的。

1. 栈

1.1 介绍

  • 栈是从高地址向低地址存储的一块连续的内存区域,特点是先进后出(FILO)
  • 栈的地址空间在在iOS里面是0X7/ 0X16开头
  • 栈区一般是在运行时分配内存,内存空间由系统管理,也就是变量在超出了自身的作用范围之后就会被释放。
  • 包含函数内部定义的局部变量以及方法参数(方法的默认参数 self,cmd) 等也都是存放在栈区。

1.2 优缺点

  • 注意,栈区的内存是由系统分配并管理的,所以它会由系统分配并自己释放,不会产生内存碎片,更快更高效。
  • 但是栈的内存大小被系统所限制所导致其并不是很灵活,iOS主线程栈的大小1MB,其他线程512KB,Mac为8M。请添加图片描述
- (void)testStack {
    int a = 10;

    NSLog(@"a == %p size == %lu",&a,sizeof(a));
    NSLog(@"方法参数 self:%p",&self);
    NSLog(@"方法参数 cmd:%p",&_cmd);
}

请添加图片描述

2. 堆区

  • 堆是从低地址向高地址的不连续的内存区域,和链表的结构很相似(便于增删但是不便于查询),特点是先进先出FIFO。
  • 堆地址是以0X6进行开头,动态的分配空间
  • 在堆里存放的东西需要我们手动的管理和释放,若不及时释放就会造成内存泄漏。
  • 在OC里面alloc和new都会为对象开辟空间到堆上
- (void)testHeap {
    NSObject *object1 = [NSObject new];
    NSObject *object2 = [NSObject new];
    NSLog(@"object1 = %@",object1);
    NSLog(@"object2 = %@",object2);
}

请添加图片描述

栈和堆的区别联系

1. 各自的优缺点?

  • 栈:由编译器自动分配并释放,速度较快,不会产生内存碎片。优点是快速高效,缺点时有限制,数据不灵活。
  • 堆:由程序员分配和释放,速度比较慢,而且容易产生内存碎片,不过用起来最方便。优点是灵活方便,数据适应面广泛,但是效率有一定降低。

2. 申请后的系统如何响应?

  • 栈:存储每一个函数在执行的时候都会向操作系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
  • 堆:操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

3. 申请大小的限制?

  • 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数 ) ,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
  • 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

3. 全局/静态区

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

其中,全局变量是指变量值可以在运行时被动态修改,而静态变量是static修饰的变量,包含静态局部变量和静态全局变量
关于static关键字之前有学习过深入理解Static关键字

int clB = 10;
static int bssB = 10;
- (void)testStatic {
    NSLog(@"clA = %p", &clB);
    NSLog(@"bssB = %p", &bssB);
}

请添加图片描述

4. 常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。
  • 常量区是编译时分配的内存空间,在程序结束后由系统释放,主要存放:
    ■ 已经使用了的,且没有指向的字符串常量
    ■ 字符串常量因为可能在程序中被多次使用,所以在程序运行之前就会提前分配内存。

5. 代码区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放
  • 程序运行时的代码会被编译成二进制,存进内存的代码区域。

总结

初步了解了iOS的内存区域,主要是栈和堆的区别和联系需要我们了然于心。

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

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

相关文章

关于AWS MSK Connector Execution Role的解释

尽管在创建AWS MSK Connector时,Execution Role是一个必填项,就像下面这样: 并且在官方文档中给出的Execution Role样例: https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-service-execution-role.html 中也…

基于JSP+Servlet的学生信息管理系统

用户类型:三角色(学生、教师、管理员) 项目架构:B/S架构 设计思想:MVC 开发语言:Java语言 前端技术:Layui、HTML、CSS、JS、JQuery、Ajax等技术 后端技术:JSP、Servlet、JDBC、…

基于JSP+Servlet的医药药品管理系统

用户类型:双角色角色(患者、管理员[医生]) 设计模式:MVC(jspservletjavabean) 项目架构:B/S架构 开发语言:Java语言 主要技术:jsp、servlet、jdbc、jsp、html5、jquery、css、js…

【哈希表/字符串-简单】LeetCode 205 同构字符串 Java

需要判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,同时t的任意一个字符被s中唯一的字符对应。这也被称为【双射】的关系。 以示例二为例,t中的字符a和r虽然有唯一的映射o,但对于s中的字符o来说…

Vim批量注释与反注释

在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码。下面简要介绍其操作。本文记录在mac/linux下的vim批量注释。 一开始我想让vim配置ctrl/快捷键,快速批量注释,但是vim的文档中不支持这样的快捷键。 如果实在要弄也能弄&…

集群基础2——LVS负载均衡httpd服务(nat模式)

文章目录 一、环境说明一、配置调度器网卡二、配置后端服务器三、配置调度器四、验证五、设置https负载均衡 一、环境说明 使用lvs中的nat模型,对http负载均衡集群。 主机IP角色安装服务真实IP:192.168.161.129VIP:192.168.161.130调度服务器…

深信服 网络工程师面试题(二)

指针函数和函数指针的区别 指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指…

牛客HJ99 - 自守数【暴力 + 换位取模】

原题传送门 原题描述 首先我们来看一下原题是怎么描述的,题面很简单,输入n,然后让我们去统计从1 ~ n之间的自守数有几个,那什么是【自守数】呢,上面也说到了,即一个数在平方之后该数的尾数等于该数自身的自…

榜单!高精定位模块/系统「争夺战」,份额Top5供应商都有谁

以当前国内车企落地高速NOA采用的主流方案为例,普遍采用了「高精定位高精地图车端传感器」的多源融合定位策略。其中,在高精定位部分,大部分采用GNSSIMURTK的方案。 从目前的智驾系统演进来看,主流的仍是在L2基础上,通…

k8s 基础命令和常用命令等

通过kubectl命令可以操作和管理K8S资源,对于初学者可以在掌握K8S基础命令的基础上再去学习K8s的原理和架构,那么K8S常用的命令有哪些呢? 01 K8S命令概述 在学习K8s基础命令前,了解和学习docker命令是很有必要的,kub…

c语言--unsigned修饰符

在C语言中,unsigned是一种无符号整数修饰符。它可以与多个整数类型(如int、short、long等)结合使用,表示该整数类型只包含非负数值。unsigned修饰的整数类型不保存正负号位,因此可以用来表示更大的正整数范围。 例如&…

干货分享|SOLIDWORKS Composer如何解决缺失的actor?

​SOLIDWORKS Composer导入SOLIDWORKS模型,以便用户可以创建图形内容并与更广泛的受众共享项目。但是,有时模型导入时缺少Actor或组件,通常是由于在SOLIDWORKS中以轻量模式加载组件或Composer中的导入设置排除了曲面实体。 轻量模式 轻量模式…

基于DEF生成LIB的方法

基于DEF生成LIB的方法 [生成64位lib] lib /def:libcurl-x64.def /MACHINE:x64 /OUT:libcurl-x64.lib[生成32位lib] lib /def:libcurl-x64.def /OUT:libcurl-x64.lib

flutter开发实战-生日等日期选择器DatePicker

flutter开发实战-生日等日期选择器DatePicker 在开发遇到设置生日等信息需要选择日期,这里用到的是CupertinoDatePicker iOS效果的日期、时间选择器 一、效果图 运行后效果图如下 二、代码实现 我们需要调用底部弹窗显示 //显示底部弹窗static void bottomShe…

07_flash全擦除实验

07_flash全擦除实验 1. SPI 协议1.1 SPI 协议1.2 SPI 物理层1.3 SPI 协议层1.3.1 SPI 通讯模式时序图1.3.2 CPHA0 时的 SPI 通讯模式1.3.3 CPHA1 时的 SPI 通讯模式 2. 实验目标3. SPI-Flash 芯片3.1 硬件资源3.2 板载 Flash 原理图3.3 操作时序3.3.1 全擦除时序3.3.2 写使能时…

天眼的使用指南,ngsoc告警分析

分以下几类讲,天眼的功能,日志分析字段,常见的烂分析,告警分析。两个实例;ngsoc的简单实用和告警分析。 #天眼功能 分为,分析平台,流量传感器,文件威胁鉴定器 #部署架构 高级危险…

大模型时代,腾讯云“复制”腾讯|WAIC2023

点击关注 文|郝鑫 编|刘雨琦 刚过去的WAIC(世界人工智能大会)俨然成为了大模型厂商的成果汇报大会。 百度文心大模型升级到3.5版本,训练速度提升2倍,推理速度提升30倍;华为云发布盘古大模型3…

MySQL~索引的优缺点是什么?有哪些优化索引的方法?

1.索引的优缺点 优点:提高查询记录的速度。 缺点: 需要占用空间,索引是一种用空间换时间的做法创建索引和维护索引都需要消耗时间,会降低表的增删查改效率,因为每次进行增删查改,都需要对索引进行维护&a…

Nacos技术

说明:Nacos是微服务框架中的注册中心技术,可用于管理、协调微服务之间的请求,可配合Feign技术,搭建一个完整的微服务框架。 一、安装&启动 可在官网(https://nacos.io/zh-cn/)提供的下载链接&#xf…

【uni-app】自定义导航栏

【uni-app】自定义导航栏 新手刚玩uniapp进行微信小程序,甚至多端的开发。原生uniapp的导航栏,并不能满足ui的需求,所以各种查阅资料,导航栏自定义内容 整理如下: 需要修改的文件如下: 1、pages.json 修…