ios - Swift 栈和堆的理解

标签 ios swift memory heap-memory stack-memory

我想快速了解堆栈和堆中存储的内容。我有一个粗略的估计: 您打印的所有内容和内存地址都不是值,而是存储在堆栈中,而作为值打印出来的内容,则在堆上,基本上根据值和引用类型。我完全错了吗?或者,您能否提供堆栈/堆的可视化表示?

最佳答案

作为 @Juul声明的引用类型存储在堆中,值存储在堆栈中。

解释如下:

堆栈和堆

堆栈用于静态内存分配,堆用于动态内存分配,两者都存储在计算机的 RAM 中。

分配在栈上的变量直接存储到内存中,访问这 block 内存非常快,它的分配是在程序编译时确定的。当一个函数或方法调用另一个函数,而另一个函数又调用另一个函数等时,所有这些函数的执行将保持挂起,直到最后一个函数返回其值。堆栈始终以 LIFO 顺序保留,最近保留的 block 始终是下一个要释放的 block 。这使得跟踪堆栈变得非常简单。从堆栈中释放一个 block 只不过是调整一个指针。

enter image description here

在堆上分配的变量在运行时分配了它们的内存,访问这 block 内存有点慢,但堆大小只受虚拟内存大小的限制。堆的元素彼此之间没有依赖关系,并且总是可以随时随机访问。您可以随时分配 block 并随时释放它。这使得在任何给定时间跟踪堆的哪些部分已分配或空闲变得更加复杂。

对于转义闭包:
需要记住的一个重要注意事项是,如果存储在堆栈中的值在闭包中被捕获,则该值将被复制到堆中,以便在执行闭包时它仍然可用。

更多引用:http://net-informations.com/faq/net/stack-heap.htm

关于ios - Swift 栈和堆的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441456/

相关文章:

ios - 如何从 JSON 数据响应中获取 UIImage?

c - 为什么在任意内存位置设置值不起作用?

c# - 需要 4 GB 或 5 GB 数字的算法 - 这可能吗?

c - 无法将我的共享内存的名称写入管道

ios - 从 "More"菜单中删除 UITabBarController 上的默认向右滑动动画

ios - UIScrollView 内的 UIViewControllers 内的 UIbutton 不会在触摸时触发

objective-c - WSDL 文件和 SOAP header

swift - Xib,标签文字变化

ios - 当外围设备消失时如何使用 CoreBluetooth 进行检测?

ios - 在 iOS 上点击行为与 disableSynchroniztion 不一致