2016-07-19 16 views
2

Ich habe eine Frage zu structSwift Struct Referenz Graf

In WWDC2016, Sitzung empfehlen sturct (Werttyp)

zu verwenden, aber wenn structs haben 3 mehr Inline-Variable Worten Struktur muss Referenzzähler als Speicher verwalten großen Wert auf Haufen

dann meine Frage
ist, wenn struct 3 eine andere Struktur haben und jede Struktur haben 2 oder 3 eine andere Struktur oder Werttyp

ich wissen will, wie sie, ob mit Bezug Count oder nicht in dieser Situation

unten ist Beispiel für structs

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

Ich glaube, wenn Sie über Referenzzählung mit Strukturen sprechen, beziehen Sie sich auf den Teil [dieser WWDC-Diskussion] (https://developer.apple.com/videos/play/wwdc2016/416/), wo sie sprechen über den existentiellen Container, der eine Heap-Zuweisung verursachen kann, wenn der Wertpuffer 3 Wörter überschreitet. Dies ist nur relevant, wenn Sie Strukturen mit Protokolltypen und (in der Regel) nicht optimierten generischen Code verwenden, aber (wie die folgenden Antworten sagen) nicht auf den Code anwendbar sind, den Sie angezeigt haben. – Hamish

Antwort

3

Strukturen und Aufzählungen haben Wert-Semantik arbeitet. Es gibt keine Vorstellung von einer Referenzzählung, weil sie durch Kopieren weitergegeben werden. Ihre Mitglieder können Zeiger auf Referenztypen sein, aber der Zeiger selbst wird kopiert. Solange Sie in einer Struktur keinen Referenztyp haben, müssen Sie sich keine Gedanken über die Referenzzählung machen.

Klar, kann man argumentieren, dass Swift intern verwendet Copy-on-Write-Optimierungen unter Verwendung von Referenztypen wie Strukturen verkleidet (zB. Array, Dictionary etc.), aber sie Wert-Semantik implementieren.

3

Sehen Sie diese Anzahl von Größen Ihrer Strukturen.

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) scheint ein „Geheimnis“ zu sein, aber das ist auch ein anderes Problem.)

Swift nicht, uns in einer Struktur keine Garantien über das Mitglied Zuteilung nicht geben, aber, wie jetzt, Swift weist alle Mitglieder auf eine Weise "flach und natürlich" zu.

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)) 

Ihr ViewModel enthält keine Verweise auf seine Mitglieder. Es hält nur seine Mitglieder flach in sich. Keine Referenzen, also zählt keine Referenz.

Möglicherweise haben Sie eine Frage dazu, wie Strukturen verwaltet werden, wenn sie tatsächlich einige Referenzen enthalten. Aber das ist ein anderes Problem als Ihre when struct have 3 another struct and each struct have 2 or 3 another struct or value type.