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

段“text segment ”是应用程序运行时应用程序代码存在的内存段。每一个指令,每一个单个函数、过程、方法和执行代码都存在这个内存段中直到应用程序退出。一般情况下,你不会真的不得不知道这个段的任何事情。

当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中。这是为应用分配的另一个段的内存空间,这是为了函数变量存储需要而分配的内存。每一次在应用中调用一个函数,“stack ”的一部分会被分配在”stack” 中,称之为”frame” 。新函数的本地变量分配在这里。

正如名称所示,“stack ”是后进先出(LIFO )结构。当函数调用其他的函数时,“stack frame ”会被创建;当其他函数退出后,这个“frame ”会自动被破坏。

“heap” 段也称为”data” 段,提供一个保存中介贯穿函数的执行过程,全局和静态变量保存在“heap”中,直到应用退出。

为了访问你创建在heap 中的数据,你最少要求有一个保存在stack 中的指针,因为你的CPU 通过stack 中的指针访问heap 中的数据。

你可以认为stack 中的一个指针仅仅是一个整型变量,保存了heap 中特定内存地址的数据。实际上,它有一点点复杂,但这是它的基本结构。

简而言之,操作系统使用stack 段中的指针值访问heap 段中的对象。如果stack 对象的指针没有了,则heap 中的对象就不能访问。这也是内存泄露的原因。

在iOS 操作系统的stack 段和heap 段中,你都可以创建数据对象。

stack 对象的优点主要有两点,一是创建速度快,二是管理简单,它有严格的生命周期。stack 对象的缺点是它不灵活。创建时长度是多大就一直是多大,创建时是哪个函数创建的,它的owner 就一直是它。不像heap 对象那样有多个owner ,其实多个owner 等同于引用计数。只有heap 对象才是采用“引用计数”方法管理它。

stack 对象的创建

只要栈的剩余空间大于stack 对象申请创建的空间,操作系统就会为程序提供这段内存空间,否则将报异常提示栈溢出。

heap 对象的创建

操作系统对于内存heap 段是采用链表进行管理的。操作系统有一个记录空闲内存地址的链表,当收到程序的申请时,会遍历链表,寻找第一个空间大于所申请的heap 节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。

例如:

NSString 的对象就是stack 中的对象,NSMutableString 的对象就是heap 中的对象。前者创建时分配的内存长度固定且不可修改;后者是分配内存长度是可变的,可有多个owner, 适用于计数管理内存管理模式。

两类对象的创建方法也不同,前者直接创建“NSString * str1=@"welcome"; “,而后者需要先分配再初始化“ NSMutableString * mstr1=[[NSMutableString alloc] initWithString:@"welcome"]; ”。

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1595230 )

再补充一点,这里说的是操作系统的堆和栈。

在我们学习“数据结构”时,接触到的堆和栈的概念和这个操作系统中的堆和栈不是一回事的。

操作系统的堆和栈是指对内存进行操作和管理的一些方式。

“数据结构“的堆实际上指的就是(满足堆性质的)优先Queue 的一种数据结构,第1 个元素有最高的优先权;栈实际上就是满足先进后出的性质的数据或数据结构。

【转载】iOS堆和栈的理解相关推荐

  1. C++:堆和栈的理解

    C++:堆和栈的理解 C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 栈的话 ...

  2. 【转载】堆和栈的内存分配

    原文:堆和栈的内存分配 在这个练习中,你会在难度上做一个大的跳跃,并且创建出用于管理数据库的完整的小型系统.这个数据库并不实用也存储不了太多东西,然而它展示了大多数到目前为止你学到的东西.它也以更加正 ...

  3. 堆和栈的理解 堆和栈的区别 什么是堆和栈 堆是什么 栈是什么

    场景出现于; 在列表(表格)渲染的时候,渲染完毕 点击表格中的每个修改按钮 定义一个空对象,this.details = {} 拿到每个表格中的item[i] 赋值给详情 this.details = ...

  4. iOS 堆和栈的区别?

    前言 堆和栈是什么?有什么区别?是干嘛的?啥东西呀这是?别急,慢慢看下去 内存管理 移动设备的内存及其有限,每一个APP所能占用的内存是有限制的 (吐槽一下:iPhone6s还是16G起步,还好我也买 ...

  5. JS中的堆和栈怎么理解?

    JS中其实是没有堆和栈的概念的,但是为了方便我们理解代码的执行过程以及执行方式,我们可以设想这么一个概念: JS把简单的数据类型存放到了栈里,在栈里直接开辟一块空间存放值: 那么复杂数据类型呢? JS ...

  6. 进程、线程、堆、栈的理解和区别!

    一:进程和线程的定义 (1)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.  (2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是 ...

  7. *关于C++堆和栈的理解

    栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等.             堆:就是那些由new分配的内存块,他们的释放编译器不去管,由 ...

  8. 定义入栈java_Java堆和栈你敢说了解吗?看完这个文章再有底气说吧

    Java中堆和栈的理解要求特别深刻,所以我们重点写了一个堆和栈的区别的文章,方便大家理解和应用. JAVA,内存模型中堆和栈的区别 在了解Java堆和栈的区别之前,我们先了解一下内存分配策略. JAV ...

  9. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

最新文章

  1. javascript运行时问题
  2. 如何设计安全的用户登录功能
  3. 多点生活在 Service Mesh 上的实践
  4. C语言 计算日期是当年的第几天
  5. oracle没报错 开不了库,oracle 数据库无法启动,报错 terminating the instance due to error 16014...
  6. 人脸识别撞脸名画_奇瑞全新电动SUV现身,“撞脸”保时捷,全铝车身,轴距2805mm...
  7. 乌班图服务器系统升级,快速从Ubuntu 20.10升级到Ubuntu 21.04的方法
  8. 精美粉色护士护理PPT模板
  9. colorbox弹出层插件使用方法及注意事项
  10. java-setBounds方法
  11. 在桌面上显示当前的IP地址和电脑名称
  12. c语言-查找字符串子串(类似strstr()函数)
  13. flash制作游戏_如何使用Flash制作简单的装扮游戏
  14. sql查询ID=1与数据后几条,并且将查询的两个数据显示在一个查询窗口中
  15. HDMI高清线怎么实现百米远距离传输
  16. 对象存储场景化开发实践-马毅-专题视频课程
  17. HTTP - 写出正确的网址
  18. DTO与实体类的区别
  19. 归因分析笔记4:PCA逆变换
  20. 教你用VS2019+WDK10+OpenVPИ-build完美编译OpenVPИ 2.5

热门文章

  1. 解决naigos+pnp4nagios部分不出图的问题
  2. PowerShell_5_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念
  3. 纯数学教程 Page 203 例XLI (6)
  4. java环境变量设置
  5. SharePonit Host WCF 注意事项
  6. 求字符串中汉字的个数
  7. 第十章 Linux下RPM软件的安装与卸载
  8. 根据windows域名找ip
  9. Java bean转换map
  10. sudo提升执行权限