Swift Struct 的引用计数

Posted

技术标签:

【中文标题】Swift Struct 的引用计数【英文标题】:Swift Struct's Reference Count 【发布时间】:2016-07-19 11:20:20 【问题描述】:

我有一个关于结构的问题

WWDC2016,session推荐使用sturct(值类型)

但如果结构体还有 3 个内联变量字,结构体必须管理引用计数,因为将大值存储到堆中

那么我的问题是 当结构有 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

【问题讨论】:

我相信当您谈论结构的引用计数时,您指的是this WWDC talk 中他们谈论存在容器的部分,如果值缓冲区超过 3 个单词,则可能会导致堆分配.这仅在使用具有协议类型的结构和(通常)未优化的通用代码时才相关——但(正如下面的答案所说)不适用于您显示的代码。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

查看这些结构的大小。

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) 似乎是一个“谜”,但这也是另一个问题。)

Swift 不给我们任何关于结构中成员分配的保证, 但是,就目前而言,Swift 以“平坦而自然”的方式分配所有成员。

 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 之外的另一个问题。

【讨论】:

以上是关于Swift Struct 的引用计数的主要内容,如果未能解决你的问题,请参考以下文章

弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导

swift 学习之自动引用计数

Swift学习笔记-自动引用计数弱引用和无主引用

Swift学习笔记-自动引用计数弱引用和无主引用

swift内存管理中的引用计数

Swift-自动引用计数(Automatic Reference Counting)(十四)