私はswift 3では強い(デフォルト)とweak(弱いキーワードで)参照を知っていますが、それと同等の共有参照がありますか?swift 3にC++ shared_ptrと同等のものがありますか?
おかげ
私はswift 3では強い(デフォルト)とweak(弱いキーワードで)参照を知っていますが、それと同等の共有参照がありますか?swift 3にC++ shared_ptrと同等のものがありますか?
おかげ
それはObjective-Cのから(ARCを介して)保持・解放を機構を継承するためスイフトにおけるメモリ管理パラダイムは、C++とは異なります。ご想像のとおり、C++のソリューションはコンパイラの負担が少なく、表現力も最適化されていますが、操作が複雑です。だから、
、あなたの質問に答えるために:strong
(デフォルト)shared_ptr
のように、基本的に動作し、weak
はweak_ptr
とunique_ptr
のようなものです直接対応する必要はありません。ただし、コンパイラがポインタの一意性を保証できる場合(例えば、関数のボディのように、同じスコープ内のオブジェクトを作成して破壊する場合)、unique_ptr
のように動作します。
もちろん、これは参照型にのみ適用されます。値の型はただコピーされます。
スウィフト決定するARC (automatic reference counting)強いの参照を適用します。 ARCとその参照カウントは自動的に実行されますが、C++の明示的な使用に類似しています(std::shared_ptr
)。後者は、オブジェクトを指し示すすべてのスマートポインタが有効範囲外になった場合、または明示的にリセット(/ヌル)された場合にのみ(共有されたptrsによって)指し示されたオブジェクトを破壊することを許可します。上記の例で
、あなたがC++のstd::smart_ptr
の等価物として強いimmutables(参考文献)foo
とbar
(foobar()
から後者の戻り)を考慮することができる:それら同じ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 */
私は実際にC++を知らないので、より多くの人々が質問に答えることができるように、動作や共有参照を説明できますか? – Sweeper