美文网首页iOS开发
聊聊iOS开发中堆与栈的区别

聊聊iOS开发中堆与栈的区别

作者: Jay_小咖 | 来源:发表于2019-04-20 11:22 被阅读0次

作为一个学计算机专业毕业的人,被面试官问到:你是学计算机的吧,那你说说栈与堆的区别?我当时的脑子里基本上是想不到怎么说,因为真的没仔细研究过这两者的详细区别,当时只是说:

堆一般是存放对象的,栈一般是存放方法、变量的。

虽然回答的也不算错,但这是很片面的回答。

所以回来后我决定再仔细复习一下这方面的知识。于是就有了这篇文章。

首先总结起来堆与栈的区别主要有以下几点:

  • 堆存储的是对象、实体,栈存储的方法参数和局部变量(存储的内容不同)
  • 栈是由编译器自动管理,无需手动控制;堆则由程序员控制,如内存区域的申请(new)和释放(release),容易内存泄漏(管理方式的不同)
  • 栈空间很小。栈是向低地址扩展的数据结构,是一块连续的内存区域;堆空间较灵活,较大。堆是向高地址扩展的数据结构,是不连续的内存区域(空间大小区别)
  • 栈内存的更新速度快于堆内存的更新速度,即栈的效率会更高(更新速度的不同)

内存管理的5大区域:

内存管理-5大内存区域.png

栈(stack)和堆(heap)都是内存区域的其中两种形式,我们称为栈区和堆区。
栈区是由编译器自动管理的,其操作方式是后进先出(LIFO),当我们运行一个方法时,方法的参数、方法中的局部变量都会被自动存储在栈区中,当出了作用域后(方法运行结束),这些参数和局部变量就会被释放。
-应用中新创建的每个线程都有专用的栈空间。
堆区则由程序员进行分配和释放,例如:

- (void)test:(NSString*)str{
   NSArray *array = [[NSArray alloc] init];
   [array release];
}

对应的栈和堆空间的分配过程:

内存管理-栈与堆.png

当创建一个对象时会在堆内存中开辟一块内存空间并进行初始化,并给对象分配了一个唯一的内存地址。创建的局部变量存储在栈中,其通过内存地址引用堆中的对象,我们也称array是一个指针,它指向的是堆中的某个对象。当发送release消息时(MRC)或作用域结束栈中的指针被释放后(ARC),对象会被释放,堆中的这块内存区域也就被释放被系统回收了。由于需要我们手动控制,所以要非常注意避免出现内存泄漏。
-每个进程的所有线程共享一个堆。

内存泄漏的主要由以下两点造成的:

  • 不正确的内存访问
  • 循环引用(保留环)

在MRC,我们如果将array = nil,而没有[array release];那么导致指针没了,堆中的对象还存在,但无法再被引用,就造成了内存泄漏。

在ARC,当方法结束后,栈中的array被编译器自动释放,就没有指针指向堆中的该对象了,编译器就会自动插入调用release回收该对象,因而不会导致内存泄漏。

相关文章

  • 聊聊iOS开发中堆与栈的区别

    作为一个学计算机专业毕业的人,被面试官问到:你是学计算机的吧,那你说说栈与堆的区别?我当时的脑子里基本上是想不到怎...

  • iOS 栈和堆总结

    转载自 :大神博客iOS程序中的内存分配iOS 堆和栈的区别block与propertyiOS中__block 关...

  • 基础知识

    1.iOS中堆和栈的区别 管理方式: 栈是由系统编译器自动管理;堆是由开发人员手动管理,控制其释放,不及时回收易产...

  • Js的浅拷贝与深拷贝

    堆和栈的区别 堆和栈都是内存中划分出来的用于存储的区域。 深拷贝与浅拷贝的区别就是其在内存中存储的类型不同。 栈(...

  • iOS中堆和栈的区别

    分区: 1,栈区(stack)由编译器自动分配释放,存放函数(方法)的参数值,局部变量的值等,栈是由高地址向低地址...

  • iOS中堆和栈的区别

    先附一张图,这里只说堆和栈 栈区(stack)由编译器自动分配释放,存放方法(函数)的参数值,局部变量的值等 堆区...

  • ##iOS中堆和栈的区别

    前言 在我们编程中,不可避免的使用堆和栈内存,它们是什么?有什么区别?下面我从几个方面来说明区别 使用内存的行为 ...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • iOS中堆和栈的使用

    iOS中堆和栈的使用

  • euqals与==的区别

    在谈==与equals区别之前,我们先来谈一谈java中堆和栈的区别。 堆内存 堆内存用于存放由new创建的对象和...

网友评论

    本文标题:聊聊iOS开发中堆与栈的区别

    本文链接:https://www.haomeiwen.com/subject/dvywwqtx.html