回答:
Swift は、オブジェクトへの最後の参照が削除されると、オブジェクトが初期化解除され、コードがすぐに実行されることを保証しdeinit
ます。
GCを通じてこの種の保証を取得することは不可能です。少なくとも、パフォーマンスを犠牲にすることなしには不可能です。標準のGCメカニズムは、deinit
コードが最終的に、たとえば次のGCサイクルで実行されることのみを保証します。正確なセマンティクスのためには、どこかに参照カウントが必要です。
chiは、swiftに関する本文の特定の質問に回答しています。この回答は、タイトルのより一般的な質問に回答します。
参照カウントGCとトレースGCは言語プロパティですか、実装プロパティですか?
参照カウントGCとトレースGCは、プログラマにさまざまな保証を提供します。
参照カウントは、オブジェクトが破棄されるプログラムフローの場所に確定性を提供します。これは、オブジェクトがすぐに解放する必要のある希少なリソースを所有している場合に重要になる可能性があります。一方、「強い」参照のサイクルを処理することはできません。
個々の言語の仕様次第で、どのような特性が保証されるのか、したがって、どの選択肢が準拠した実装で利用可能になるかが決まります。
Swiftと呼ばれる言語を使用して、名前を「Swift with ARC」に変更できます。次に、まったく同じ構文で「Swift with GC」という名前の新しい言語を作成できますが、オブジェクトの割り当てがいつ解除されるかについての保証は少なくなります。
Swift with ARCでは、参照カウントが0になると、オブジェクトが移動します。ガベージコレクションを使用すると、弱い参照がある限り、その弱い参照を強い参照に割り当ててオブジェクトを「回復」できます。(Swiftでは、参照カウントが0になると、弱参照はnilになります); それが大きな違いです。
そしてもちろん、ARCを備えたSwiftでは、最後の参照カウントを強制終了すると、オブジェクトの割り当てがすぐに解除されることが保証されます。たとえば、FileWriterクラスがあり、2つのインスタンスが同時に存在する同じファイルに書き込むことは許可されていません。SwiftとARCでは、oldWriter = nilと言うことができます。newWriter = FileWriter(...)そして、新しいFileWriterは古いファイルが削除された後にのみ作成されることがわかります(別の参照を保持していない限り)。Swift with GCでは、これは機能しません。
もう1つの違いは、「Swift with ARC」では、強い参照サイクルによってのみ参照され、実際には到達できないオブジェクトは、割り当て解除されないことが保証されていることです。
deinit
キーワードの存在とそれに関連するセマンティクスは、実際には、参照の数え方を実装の領域ではなく、言語の中で真っ直ぐに置くものです。