对iOS的内存存储的一些理解

最近写项目的时候遇到了一些内存上的问题(比如内存泄漏等等),通过网上的方法解决后,好奇iOS的数据是如何存储的,特记于此。

一、iOS的内存区域

iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:"text segment ","stack segment ","heap segment "。

栈(Stack):

当我们创建一个值类型,如结构体,系统将其存储在一个被称为栈的内存区域中,是由CPU直接管理和优化的。当一个函数声明一个变量,变量将存储在栈中,当函数调用完毕后栈会自动释放该变量。因此栈是非常易于管理的、有效的,由于是CPU直接控制,速度非常快。栈使用的是一级缓存,被调用完毕后会直接释放。

堆(Heap):

当我们创建了一个引用类型 ,如类,系统将把类实例存储在一个被称为堆的内存区域中。系统使用堆来存储其他对象引用的数据。堆是一个大的内存池,系统可以从该池中请求并动态分配内存块。注意:堆是动态分配内存的,堆不会像栈一样自动释放对象,需要额外的工作来完成。这使得在堆中创建和删除数据比栈慢。并且如果程序员不释放的话,就会造成内存泄漏。

BSS:

存储未被初始化的全局变量和静态变量。

Data:

存储已经初始化的全局变量和静态变量,是静态内存分配。

代码区(text segment ):

程序代码(比如操作码(指令)等)。

栈和队列都是动态分配区

其余为静态分配区

二、静态分配和动态分配

1、静态存储方式

程序未运行,编译阶段根据需要分配固定的存储空间。

2、动态存储方式

是指在程序运行期间根据需要进行动态的分配存储空间的方式。

动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 (例如函数的调用,参数的使用)。

三、堆、栈的区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。

栈(数据结构):一种先进后出的数据结构。

区别:

1、管理方式不同;

栈的释放是由编译器操作的,而堆得由程序员手动释放,否则会发生内存泄漏。

2、存储方式不同;

堆的存储是碎片化的,就像一个内存池(或者树)一样,如果有多个owner就会造成程序的缓慢。而栈是先进后出的数据结构,存储的内存是一个接一个的,以至于永远都不可能有一个内存块从栈中间弹出。

3、分配方式不同;

堆都是动态分配的,没有静态分配的堆 。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

4、空间大小不同;

栈的空间很小,且是由CPU直接调度并执行的,所以运行很快。

堆的空间很大,就像一个大鱼塘。iOS使用了名为 ARC(自动引用计数)的技术。在多线程环境中,多个线程会共享堆上的内存,为了确保线程安全,不得不在堆上进行加锁操作,但是加锁操作是很耗费性能的,你在堆上所获的的数据安全性实际上是在牺牲性能的代价下得来的。

NSString 的对象就是stack 中的对象,NSMutableString 的对象就是heap 中的对象。

四、常见的存储区域

全局变量存储在静态存储区域,在程序运行的时候始终占据固定的区域。

局部变量存储在堆栈中,即动态存储区域。

常量存储在特殊的常量静态存储区。

swift的数据类型分为值类型和引用类型,一般来说,值类型存储在栈上,而引用类型存储在堆上,但实际上是视情况而定的。具体可参考iOS里变量在内存中的存储方式 - 掘金

五、数据持久化

参考:

https://www.jianshu.com/p/cb10f2c0aa93

https://www.jianshu.com/p/39ba5db32bb5

相关推荐
for_ever_love__4 小时前
UI学习:UISearchController基础了解和应用
学习·ui·ios·objective-c
代码的小搬运工9 小时前
ZARA仿写
ios
z2005093010 小时前
【linux学习】深入理解linux文件I/O,从C标准库到内核态
linux·学习·操作系统
人月神话Lee11 小时前
【图像处理】vImage/Accelerate——SIMD 让 CPU 也能飞
ios·swift·图像识别
量子炒饭大师12 小时前
【Linux系统编程:进程概念】——【从 冯诺依曼系统体系结构 到 操作系统】
linux·运维·服务器·操作系统·冯诺依曼
带娃的IT创业者12 小时前
数字考古学:当整个操作系统史被装进一个浏览器
操作系统·前端开发·webassembly·虚拟化技术·数字考古学·windows 95·复古计算
2601_9557674214 小时前
iPhone 17 护眼钢化膜怎么选?从PWM频闪到圆偏振光,解析「软硬协同」光学方案
ios·ar·iphone·护眼钢化膜·圆偏振光·#观复盾护景贴·磁控溅射
2601_9557674217 小时前
iPhone 17 护眼保护膜怎么选?圆偏振光 + AR 抗眩方案,解读 96% 透光率与 ≤0.5% 反射率的协同价值
ios·ar·iphone·圆偏振光·#观复盾护景贴·scinique双护技术
三雒18 小时前
KMP 实战:Android 开发如何快速统一双端 IM 模块
android·ios·kotlin
秋雨梧桐叶落莳19 小时前
iOS——抽屉视图详解
开发语言·macos·ui·ios·objective-c·cocoa