我想要在swift中不需要存储在堆栈/堆中的内容。我有一个很好的估计: 您打印的所有内容和内存地址都不是值,它们存储在堆栈中,以及作为值打印的内容,这些值在堆上,基本上根据值和引用类型。我完全错了吗?并且可选地,您能提供堆栈/堆的可视化表示吗?
答案 0 :(得分:44)
如juul所述,引用类型存储在堆中,值存储在堆栈中......
我想在此解释原因......
堆叠和堆?
Stack用于静态内存分配和堆用于动态内存分配,两者都存储在计算机的RAM中。
在堆栈上分配的变量直接存储到存储器中,对该存储器的访问非常快,并且在编译程序时会分配它。当函数或方法调用另一个函数,该函数又调用另一个函数等时,所有这些函数的执行将保持挂起,直到最后一个函数返回其值。堆栈始终以LIFO顺序保留,最近保留的块始终是要释放的下一个块。这使得跟踪堆栈非常简单,从堆栈中释放块只不过是调整一个指针。
在堆上分配的变量在运行时分配了内存并且访问此内存有点慢,但堆大小仅受虚拟内存大小的限制。堆的元素彼此之间没有依赖关系,并且可以随时随机访问。您可以随时分配一个块并随时释放它。这使得在任何给定时间跟踪堆的哪些部分被分配或释放变得更加复杂。
逃离关闭: - 需要记住的一个重要注意事项是,如果在闭包中捕获存储在堆栈中的值,则该值将被移动到堆中,以便在执行闭包时它仍然可用。
答案 1 :(得分:15)
类(引用类型)在堆中分配,值类型(如Struct,String,Int,Bool等)存在于堆栈中。有关更详细的解答,请参阅此主题:Why Choose Struct Over Class?
答案 2 :(得分:3)
堆栈与堆
Stack
是线程的一部分。它由 LIFO 顺序的方法(功能)框架组成。方法框架包含局部变量。实际上,它是您在调试或分析错误[About] 期间看到的方法堆栈跟踪。创建了新的值副本 - 它可以是 reference type
地址的副本或 value type
(写入时复制机制)的副本。线程安全[About]
Heap
ARC[About] 发挥作用的另一部分记忆。在这里分配内存需要更多时间(找到合适的地方并以同步方式分配)。创建了新的参考副本
这些概念与[JVM illustration]
相同Xcode 使用 Debug Memory Graph