iOS开发面试题:堆和栈的区别

发布网友 发布时间:2022-04-21 17:35

我来回答

1个回答

热心网友 时间:2023-06-27 04:08

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

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

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

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

内存管理的5大区域:

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

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

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

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

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

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com