2016-12-21 14 views
1

私はswift 3では強い(デフォルト)とweak(弱いキーワードで)参照を知っていますが、それと同等の共有参照がありますか?swift 3にC++ shared_ptrと同等のものがありますか?

おかげ

+1

私は実際にC++を知らないので、より多くの人々が質問に答えることができるように、動作や共有参照を説明できますか? – Sweeper

答えて

3

それはObjective-Cのから(ARCを介して)保持・解放を機構を継承するためスイフトにおけるメモリ管理パラダイムは、C++とは異なります。ご想像のとおり、C++のソリューションはコンパイラの負担が少なく、表現力も最適化されていますが、操作が複雑です。だから、

、あなたの質問に答えるために:strong(デフォルト)shared_ptrのように、基本的に動作し、weakweak_ptrunique_ptrのようなものです直接対応する必要はありません。ただし、コンパイラがポインタの一意性を保証できる場合(例えば、関数のボディのように、同じスコープ内のオブジェクトを作成して破壊する場合)、unique_ptrのように動作します。

もちろん、これは参照型にのみ適用されます。値の型はただコピーされます。

+0

変数が参照型か値型かを知ることができるディレクティブまたは関数がすぐにありますか? – Bob5421

+2

値がAnyObjectにキャスト可能な場合は、参照型です。それ以外の場合は、値型です。 ( '値はAnyObject'ですばやく)。 – Sealos

2

通常は(弱いまたは未所有修飾子なし) varsのshared_ptrのと同様の意味を持ちます。 (すなわち、そのオブジェクトへの強い参照の数がゼロの場合)参照タイプインスタンスによって使用されるメモリを解放するとき

+0

もちろん、リファレンスタイプのみです。 – Rob

+0

普通のバーは強い参照です – Bob5421

+0

@ Bob5421はい、ポインタは参照を保持している参照カウンタを保持していますが、カウンタがゼロになると、shared_ptrと同じになります。 – Sealos

1

スウィフト決定するARC (automatic reference counting)強いの参照を適用します。 ARCとその参照カウントは自動的に実行されますが、C++の明示的な使用に類似しています(std::shared_ptr)。後者は、オブジェクトを指し示すすべてのスマートポインタが有効範囲外になった場合、または明示的にリセット(/ヌル)された場合にのみ(共有されたptrsによって)指し示されたオブジェクトを破壊することを許可します。上記の例で

、あなたがC++のstd::smart_ptrの等価物として強いimmutables(参考文献)foobarfoobar()から後者の戻り)を考慮することができる:それら同じFooオブジェクトをポイントし、唯一の両方の両方オブジェクトが初期化されません。

class Foo { 
    init() { print("initializing") } 
    deinit { print("deinitialized") } 
} 

func foobar() -> Foo { 
    let foo = Foo() // strong reference 
    let bar = foo // another strong reference 
    // total "shared" count is now 2 
    return bar 
    // reference associateced with 'foo' goes 
    // out of scope, but the reference associateced 
    // with 'bar' is returned from the function, and 
    // thus, ARC still keeps the Foo instance alive. 
} 

func bar() { 
    print("calling foobar ...") 
    let bar = foobar() // retains the reference from 'bar' in foobar() 
    print("foo() is now out of scope") 
    print("leaving bar() scope ...") 
} // 'bar' of bar() goes out of scope: Foo object should be deinitialized 

bar() 
/* calling foobar ... 
    initializing 
    foo() is now out of scope 
    leaving bar() scope ... 
    deinitialized    */ 
/* ^^^^^^^^^^^^^- ok */ 
関連する問題