2016-07-19 11 views
2

カウント、セッションはsturct(値型)を使用することをお勧めしますスウィフト構造体のリファレンス私はWWDC2016で構造体</p> <p>について質問があり

しかし、構造体は、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 
} 
+2

structsの参照カウントについては、[このWWDCトーク](https://developer.apple.com/videos/play/wwdc2016/416/)の部分を参照していますバリューバッファーが3ワードを超えた場合にヒープ割り当てが発生する可能性のある存在コンテナについてです。これは、プロトコルタイプ、および(一般的に)最適化されていないジェネリックコードを持つ構造体を使用する場合にのみ関係しますが、(以下の答えとして)あなたが示したコードには当てはまりません。 – Hamish

答えて

3

構造と列挙値-セマンティクスを持つ構造体の一例です。コピーによって渡されるため、参照カウントの概念はありません。それらのメンバは参照型へのポインタかもしれませんが、ポインタ自体がコピーされます。構造体に参照型を持たない限り、参照カウントについて心配する必要はありません。確かに

は、一つは(Dictionaryなど、Arrayなど。)スウィフトは内部構造を装った参照型を使用してコピー・オン・ライト最適化を使用していることを主張するかもしれないが、彼らは価値のセマンティクスを実装

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)は「謎」のようですが、それはまた別の問題である。)

スウィフトは、私たちに構造体のメンバーの割り当て、 についていかなる保証を与えるが、今のようはありません、 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以外の問題です。

関連する問題