いくつかのデバッグ中に、次のようなコードに出くわしました
public IEnumerable<ISomething> TheSomeThingList
{
get
{
var somethings = new List<ISomething>();
// Fill the list by doing some iteration over internal dictionary of dictionaries
return somethings.AsEnumerable();
}
}
ここで、デバッグ中に、オブジェクトが内部辞書から削除されている間、このリストが常にオブジェクトを保持していることに気付きました。このリストは削除されたオブジェクトへの参照を保持しているため、
そのようなコードはメモリ リークを引き起こす可能性がありますか?
はいの場合、この問題の解決策は何ですか? プロパティのインターフェイスを変更できないことに注意してください。
私の最初の反応は、バッキング フィールド Collection を作成し、内部の削除が発生するたびにそれをクリアすることです。
いくつかの詳細 -
- 上記のプロパティを持つクラスは、アプリケーション レベルのシングルトンです (シングルトン パターンではなく、ユニティによって達成されます)。
- リストに入力されたオブジェクトは、特定の操作 (ドキュメントを閉じるなど) の後にクリーンアップされることになっています。これらのオブジェクトを保持しても、ガベージ コレクションは許可されません。