重庆哪家在做网站建设,php网站后台验证码不显示,网站建设公司市场,wordpress主题在哪最近写项目的时候遇到了一些内存上的问题#xff08;比如内存泄漏等等#xff09;#xff0c;通过网上的方法解决后#xff0c;好奇iOS的数据是如何存储的#xff0c;特记于此。
一、iOS的内存区域 iOS 中应用程序使用的计算机内存不是统一分配空间#xff0c;运行代码使… 最近写项目的时候遇到了一些内存上的问题比如内存泄漏等等通过网上的方法解决后好奇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