`
mikixiyou
  • 浏览: 1098992 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353155
社区版块
存档分类
最新评论

iOS中的堆(heap)和栈(stack)的理解

    博客分类:
  • iOS
阅读更多

操作系统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 个元素有最高的优先权;栈实际上就是满足先进后出的性质的数据或数据结构。

 

2
1
分享到:
评论

相关推荐

    阿里 ios 面试题及答案

    在iOS开发中,栈主要用来存储局部变量和函数调用信息等。当一个函数被调用时,它的参数和局部变量会被压入栈中;当函数返回时,这些信息会被弹出栈。栈的空间相对较小,但访问速度快。 **堆 (Heap)**:堆是一种动态...

    2022年最新iOS面试题附答案.docx

    类是在堆(heap)上存储的,而结构体是在栈(stack)上存储的。 类有以下几个功能: 1. 继承:类可以继承父类的特性和方法。 2. 类型转换:可以在 runtime 时检查和解释一个实例的类型。 3. 释放资源:可以使用 ...

    IOS内存管理与软件调试

    另外,iOS中的内存管理还包括了解内存的三个区域:堆(Heap)、栈(Stack)和内联存储(BSS/Static)。栈内存由系统自动分配和回收,用于存储局部变量;堆内存则需要程序员手动管理,适用于动态创建的对象;内联存储...

    ios-block 多参数传值.zip

    总之,理解并熟练使用Block是iOS开发中的必备技能,它能够提高代码的可读性和灵活性,使代码更易于维护。在这个"ios-block 多参数传值"的项目中,你可以学习到如何创建和使用Block来传递多个参数,以及如何在实际...

    iOS 面试题汇总

    1. **栈 (Stack) 与堆 (Heap) 区别** - 栈内存的特点及使用场景。 - 堆内存的特点及使用场景。 #### 深拷贝与浅拷贝 1. **深拷贝 (Deep Copy) 与浅拷贝 (Shallow Copy)** - 对象属性的复制行为,包括属性值的...

    iOS内核漏洞挖掘_xKungfoo20151

    Stack/Heap cookies,检测堆栈和堆的篡改;Kernel space isolation,确保内核空间的安全;以及禁止执行内核堆等。 尽管有这些安全防护,但由于iOS内核实现了很多功能,因此依然存在漏洞挖掘的可能性。Fuzzing是一种...

    ios-block循环引用的三种解决办法.zip

    Block有两种存储类型:栈(stack)和堆(heap)。默认情况下,Block存储在栈上,当包含强引用的对象时,会引发循环引用。将Block复制到堆上,可以使Block拥有独立的生命周期,避免循环引用: ```objc self....

    iOS App 内存专项实践:封闭系统下的大自由.pdf

    iOS设备的内存分为几个部分,包括堆(Heap)、栈(Stack)、代码(Code)、常量(Constant)和数据(Data)区。栈用于存储函数调用和局部变量,而堆则用于动态分配内存,如对象实例。理解这些分区的工作方式可以帮助开发者更...

    Objective-C 内存管理机制 - iOS知识库1

    Objective-C 是 iOS 开发中的主要编程语言,其内存管理机制对于优化应用性能和防止内存泄漏至关重要。内存管理主要关注如何有效地分配和释放内存,确保程序的稳定运行。 1. **值类型与引用类型:** - **值类型**...

    iOS block实现,内存管理

    2. **堆区(Heap)**:如果Block需要被长期保存(例如赋值给全局变量或强引用的属性),那么它会被复制到堆上。这时,Block内部捕获的自动变量也会被复制并保存,遵循ARC(Automatic Reference Counting)规则进行...

    iOS面试题及答案

    栈区(stack):由编译器自动分配释放,存放方法(函数)的参数值,局部变量的值等。堆区(heap):一般由程序员分配与释放,若程序员不释放,则内存溢出。 九、用户自定义对象的拷贝 必须实现 copying 和 ...

    Block学习ios开发

    Block是iOS开发中的一个重要概念,它是Objective-C和Swift语言中的一种强大的特性,允许开发者在代码中定义局部函数或者闭包,并且可以在其他地方被引用和执行。本文将深入探讨Block的基础知识、工作原理以及如何在...

    ios block学习总结demo

    Block是iOS和Mac OS开发中的一个重要概念,它是Objective-C(OC)语言的一种特性,也是Cocoa Touch框架的关键组成部分。在iOS应用开发中,Block经常被用来处理异步操作、简化回调函数、创建自定义迭代器等。下面我们...

    iOS Hackers Handbook

    这里提到了一些高级技巧,如堆喷射(Heap Spraying)和堆栈重定向(Stack Pivot)等。 #### TCMalloc简介 除了系统自带的分配器之外,谷歌开源项目TCMalloc也常被用于替代品。这部分内容简单介绍了TCMalloc的特点...

    常见的IOS知识点汇总

    1. 堆和栈的区别: - 栈(Stack):栈是一种线性数据结构,遵循后进先出(LIFO)原则。栈的内存由编译器自动分配和释放,用于存储函数调用时的局部变量、函数参数等。由于栈的管理非常高效,但空间有限,通常只有几...

    阿里P6一面参考答案-1.pdf

    关于内存的几大区域,首先要介绍的是栈区(stack),这是一个由编译器自动分配和释放的区域,用于存放函数的参数值、局部变量等。它的优点在于快速高效,但同时也有一定的限制,如数据不灵活。栈区中的空间分配和释放...

    阿里P5三面参考答案-1.pdf

    2. 堆区(heap):这是由程序员进行分配和释放的内存区域,如果程序员忘记释放,将导致内存泄漏。在iOS开发中,使用alloc分配的对象都存储在堆区。堆区的优点在于其灵活性,可以存储各种类型的数据,但缺点是效率...

    19南航计算机复试总结和面试题汇总1

    2. **堆和栈的区别**:堆(Heap)是一种特殊的树形数据结构,通常用于优先队列的实现,满足最大堆或最小堆的性质,即父节点的值总是大于或小于其子节点。而栈(Stack)是一种后进先出(LIFO)的数据结构,常用于函数...

    iOS Block解开多年以来一直的误解

    - **Block的内存管理**:Block有两种存储类型:栈上(stack)和堆上(heap)。栈上的Block生命周期短,当离开作用域时自动释放;堆上的Block则需要手动管理内存,如赋值给全局变量或强引用。 ### 2. Block的特殊性...

    IOS_Assignment_2:iOS分配

    首先,我们要了解Swift中的内存分为堆(Heap)和栈(Stack)。栈主要用来存储基本类型(如Int, Double, Bool, Char)和结构体(Struct),而堆则用于存储类(Class)实例和其他复杂的数据结构。栈内存由编译器自动...

Global site tag (gtag.js) - Google Analytics