Swift Struct的引用计数

时间:2016-07-19 11:20:20

标签: swift struct reference-counting wwdc

我对struct

有疑问

在WWDC2016中,会话建议使用sturct(值类型)

但是如果结构有3个以上的内联变量字,struct必须管理引用计数作为存储大值到堆

然后我的问题是 当struct有3个另一个结构时,每个结构有2或3个另一个结构或值类型

我想知道在这种情况下是否使用引用计数

是如何工作的

下面是结构的例子

struct ViewModel {
     var titleModel: TitleModel
     var contentModel: ContentModel
     var layoutModel: LayoutModel
}

struct TitleModel {
     var text: String
     var width: Float
     var height: Float
}

struct ContentModel {
     var content: String
     var width: Float
     var height: Float
}

struct LayoutModel {
     var constant: Float
     var multiply: Float
}

2 个答案:

答案 0 :(得分:3)

结构和枚举具有价值语义。没有引用计数的概念,因为它们是通过复制传递的。它们的成员可能是引用类型的指针,但指针本身是复制的。只要您在结构中没有引用类型,您就不必担心引用计数。

当然,有人可能会争辩说Swift内部使用伪装成结构的引用类型(例如ArrayDictionary等)使用写时复制优化,但是它们实现< / em> value-semantics。

答案 1 :(得分:3)

查看结构的这些数量。

print(sizeof(ViewModel))     //->72 == sizeof(TitleModel) + sizeof(ContentModel) + sizeof(LayoutModel)
print(sizeof(TitleModel))    //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(ContentModel))  //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(String))        //->24 (a mystery...)
print(sizeof(LayoutModel))   //->8 == sizeof(Float) + sizeof(Float)

sizeof(String)似乎是一个神秘的&#34;,但这也是另一个问题。)

Swift没有给我们任何关于结构中成员分配的保证, 但是,就目前而言,Swift以一种平坦而自然的方式分配所有成员&#34;。

 ViewModel:
 offset content                 size
  0     TitleModel.text          24
 24     TitleModel.width          4
 28     TitleModel.heigth         4
 32     ContentModel.content     24
 56     ContentModel.width        4
 60     ContentModel.height       4
 64     LayoutModel.constant      4
 68     LayoutModel.multiply      4
 --
 72     Total(=sizeof(ViewModel))

您的ViewModel不包含对其成员的引用。它只是将其成员平放在里面。没有参考,因此,没有参考计数。

您可能对结构在实际包含某些引用时的管理方式有疑问。但这是另一个问题,而不是when struct have 3 another struct and each struct have 2 or 3 another struct or value type