Dispose()
メソッドを実装する場合は、大きなオブジェクトをnull
に設定する必要がありますか?ガベージコレクション:Disposeメソッドで大きなオブジェクトをnullに設定する必要がありますか?
答えて
通常はありません。
ガベージコレクタはルートオブジェクトを検索し、いずれのオブジェクトもルートされていない場合、循環依存がコレクションを妨げません。
警告があります。オブジェクトAにオブジェクトBへの参照があり、オブジェクトBが破棄されている場合は、その関係をクリーンアップしたい場合があります。そうしないと、リークが発生する可能性があります。このサーフェスがイベントハンドラ内で最も一般的な場所です(A-> Bからの参照は、Aのイベントに登録されているため、Bが制御するものです)。この場合、たとえAがまだ根づいていれば、処分されていてもBを収集することはできません。
クラスにDisposeメソッドがある場合、それを呼び出すのがベストプラクティスです。その理由は の後ろには、呼び出されたときにDisposeが実行されますが、オブジェクトを に設定すると、GCのFinalizeキューにエントリが追加されるだけで、GCがいつ実行されるかは決めることができません。
ガベージコレクタによって自動的に再利用されるため、管理リソース(配列など)のみを使用する型に対してDisposeメソッドを実装すると、パフォーマンス上のメリットはありません。 Disposeメソッドは、主にネイティブリソースを使用する管理オブジェクトおよび.NET Frameworkに公開されているCOMオブジェクトで使用します。ネイティブリソース(FileStreamクラスなど)を使用する管理オブジェクトは、IDisposableインターフェイスを実装します。
「使用する」構造を使用することを採用しているDisposeを呼び出す優雅な手段。あなたが構築に精通していない人にとっては、操作の間に例外がスローされても、IDisposableを実装するインスタンスに対してDispose()を暗黙に呼び出す手段を提供します。以下の構築物の使用例である:前の例で
using(DisposableClass dc = new DisposableClass())
{
dc.PerformActionOnUmanagedResources();
dc.PerformAnotherActionOnUmanagedResources();
}
を例外PerformActionOnUmanagedResources()メソッドでスローされた場合PerformAnotherActionOnUmanagedResources()メソッドが処理されないであろうが、使用ブロックはまだ意志暗黙のうちに、dcのDisposeメソッドが呼び出され、アンマネージド・リソースの実体が保証されます。
disposeメソッドの目的は、基底クラスのdisposeメソッドを呼び出すことによって、クラスに関連付けられたすべてのリソースと親のクラスを解放することです。それは物事が少し明確にする必要があり、このリンクの読み取りを持っている:
あなたは、「ラージオブジェクト」とはどういう意味ですか?
IDisposableを実装しているメンバーであれば、少なくともDispose()を呼び出す必要があります。
他の人が指摘しているように、必ずしも必要ではありませんが、デバッグには役立ちます。
ポインタを使ってオブジェクトを終了すると、それをnullに設定すると、そのオブジェクトの再利用を防ぐことができます(null参照例外が発生します)。
削除されたC++デストラクタのメンバポインタをnullに設定するのと同じロジックが適用されます。これを行うにはにはが必要ですが、後でトラブルシューティングに役立ちます。
使い捨てメソッドの目的について少し考えてみましょう。通常、ガベージコレクション中に解放されないリソースがあるためです。これは通常、データベース接続やファイルハンドルのようなものです。したがって、Disposeメソッドが呼び出されると、それらのリソースはすべて解放されます。
私は、ヌルを浮かべることは、 "ゾンビ"オブジェクトを浮かべることがより有害であると主張したいと思います。
- 1. オブジェクトをnullに設定するDispose()
- 2. ARCでviewDidUnloadでIBOutletプロパティをnullに設定する必要があります
- 3. HTMLテキストボックスの値をnullに設定する必要がありますか?
- 4. SqlTransactionはDisposeを呼び出す必要がありますか?
- 5. どのメソッドでUITextFieldのデリゲートを設定する必要がありますか?
- 6. Javascriptで使用した後にオブジェクトをnullに設定する必要はありますか?
- 7. オブジェクトをクラスのメソッドに渡すときに、定数として*定義する必要がありますか?
- 8. ViewControllerでUIGestureRecognizerを設定する必要がありますか?
- 9. ビューでモデルデータを設定する必要がありますか?
- 10. メソッド内でクラスプロパティを設定するときに、それを解放する必要がありますか?
- 11. 大きなファイルを削除する必要があります
- 12. NodeMailer - トランスポートオプションはトランスポートインスタンスまたは設定オブジェクトである必要があります
- 13. Cocoaでオブジェクトを宣言するとき、それらをnilに設定する必要がありますか?
- 14. EventWaitHandleをDispose()またはClose()する必要がありますか?
- 15. プロパティでメソッドを定義する必要があります
- 16. 大きなPDFを扱う場合は、コンテンツの長さを設定する必要がありますか?
- 17. イベントハンドラを持つユーザーコントロールのDisposeを実装する必要がありますか?
- 18. nullオブジェクトにメソッドがありません[] =
- 19. 大きなアプリにハイブリッドアプリを使用する必要がありますか?
- 20. 大きな配列をローカルにする必要がありますか?
- 21. 大きなプロジェクトにMySQL 6.0を使用する必要がありますか?
- 22. クロムエクステンションのイベントリスナーを設定する必要がありますか
- 23. elmah.mvcリモートアクセス、何を設定する必要がありますか?
- 24. AssemblyConfigurationAttributeを設定する必要がありますか?
- 25. なぜオブジェクトを割り当てて、インスタンス変数をObj-Cで設定する必要がありますか?
- 26. InputListenerオブジェクトのメソッド内でアクションを実装する必要がありますか?
- 27. Macで$ PYTHONHOMEを設定する必要があります
- 28. エラー:elasticsearch.ymlでsmtp.hostを設定する必要があります
- 29. install4jでjava32ビットを設定する必要があります
- 30. メソッドをDOMオブジェクトに追加する必要がありますか?
イベントと廃棄は実際には関連していません。 「処分された」とは、「収集された」という意味であれば、そうです。そうでなければ、あなたの表現はあまり明確ではありません。 –
リファレンスに関するこの回答に(遅く)警告を追加するにはリークにつながる可能性のあるシナリオはごくわずかしかなく、実際にはほとんどが「認識」されているリークは実際にはありません。このMSDNブログには、非常に良い書き方があります:http://blogs.msdn.com/b/davidklinems/archive/2005/11/16/493580.aspx –