存储在swift中的值类型对象在哪里?

时间:2017-12-07 02:41:34

标签: swift

我声明了一个Array对象,如:

let data = ["foo", "bar"]

swift中的数组类型是值类型,它存储在哪里?堆还是堆栈?

我猜它存储在堆中,但如何访问它?

它是否遵循ARC规则,什么时候会发布?

你能告诉我对象记忆的图形吗?

2 个答案:

答案 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;