我声明了一个Array对象,如:
let data = ["foo", "bar"]
swift中的数组类型是值类型,它存储在哪里?堆还是堆栈?
我猜它存储在堆中,但如何访问它?
它是否遵循ARC规则,什么时候会发布?
你能告诉我对象记忆的图形吗?
答案 0 :(得分:1)
在Swift或其他语言中,默认情况下,值类型存储在堆栈中,参考类型存储在堆中。
如果值是引用类型的一部分,则它存储在堆中。
因此我们不需要引用计数,并且在其范围结束后该值将是干净的,或者在容器被释放时则是另一种情况。
在您的示例中:Array
实例的数据将存储在Application的Stack中,而其元素可以存储在Heap中,具体取决于元素是引用类型还是值类型。
答案 1 :(得分:1)
给出空数组:
let data = Array<Any>()
swift中的数组类型是值类型,它存储在哪里?堆还是堆栈?
这是一个常量的空数组,因此无处存储。字面上无处可去。如果它中有一些元素,它们的框将存储在堆栈中。这些框的内容可能会根据大小存储在堆栈或堆中。如果它有更多元素,那么这些框也将存储在堆上。
它是否遵循ARC规则,什么时候会发布?
当指示对象超出范围时,会销毁值类型,因此每当data
离开作用域时。 ARC与此无关。也就是说,如果有后备(堆)存储的其他引用,则该存储可能不会被销毁,直到稍后且ARC完全相关(但完全是内部的,因此与data
无关)。
你能告诉我对象记忆的图形吗?
在给定的情况下,对象存储器的图形是:
那就是它。没有记忆。但如果你把东西放在里面,那么它会在很大程度上依赖于你把它放进去的东西。
我知道我在这里非常轻率。这是故意的。答案是&#34;它取决于,而且,在大多数情况下,您不应该关心,并且在所有情况下,它都是一个未承诺的内部实施细节,可能会在不同版本之间发生变化&#34;
不幸的是,Swift几乎没有任何承诺。即便如此,我们确实从Swift团队获得了大量具体信息。来自WWDC 2016的最佳资源是Understanding Swift Performance,它解释了内部存储器布局。它可能不像你期待的那样,它非常依赖于数组的细节。鉴于您所询问的阵列,答案是“无处可去;它是空的。&#34;