WeakReference.Target によって参照されるターゲット オブジェクトがガベージ コレクションされると、WeakReference はどうなりますか? WeakRerence は存続し、存在し続けますか? 私が尋ねている理由は、リストに格納されている WeakReferences のリストがあるからです。実行時に、新しい WeakReferences が常にそのリストに追加されます。ターゲット オブジェクトが死んだら、放棄された WeakReference を自分でクリーンアップする必要がありますか? もしそうなら、これを行うための巧妙なトリックはありますか? WeakReference が放棄されたときに通知を受け取ることはできますか? または、そのリストを頻繁にループするタイマーを導入して、そのリストから WeakReference インスタンスを削除できるかどうかを確認する必要がありますか。
2 に答える
これは弱参照でよくある問題です。参照自体は通常のポインタを持っているため、生きたままです。あなたが提案するように、時々「手動ガベージコレクション」を行う必要があります。別の理由でリストをトラバースしているときに、おそらく途中でスタブをクリーンアップできることに注意してください。リストの使用パターンによっては、この「サイド」ガベージ コレクションで十分な場合もあります。
リストをクリーンアップするためだけに、リストを「頻繁に」ループしないでください。それぞれのデッド スタブは、数語のメモリを浪費するだけです。リストが頻繁に使用されない場合、クリーニングの計算コストは正当化されないことが多く、頻繁に使用される場合は、上記のように自動的にクリーンアップされます。
これは完全に別のガベージ コレクション システムにありますが、問題は非常に似ているため、入手できればこの記事に興味があるかもしれません。
WeakReference オブジェクトへの強い参照があるため、GC されません。これも設計によるものです。これは、WeakReference を引き続き使用して、ターゲットが GC されていることを確認できるようにするためです。
そうです、あなたはタイマーの道を行かなければなりません。
追加: Garbage Collection Notificationsも参照してください。