2011-12-06 19 views
2

私はTabControlを持っており、各タブにはTradeBookSetViewModelが含まれています。 Tradebookがかなり大きくなるので、ユーザーは必要に応じて本を削除することができます。この参照はメモリリークを引き起こしますか?

DeleteBook(オン

)私は単にのObservableCollectionからTradeBookSetViewModelを削除:

_bookSetViewModels.Remove(oldbook); 

その後、私はプレースホルダとして新しいemptyBookを作成し、同じタブ位置に挿入します。このタブはまだtradeBookを保持しているように見えますが、実際は空です。

私はUnity Containerから新しいインスタンスを解決し、oldBookのDisplayNameをemptyBookにコピーします。

BookSetViewModel emptyBook = _container.Resolve<BookSetViewModel>(); 
emptyBook.DisplayName = oldbook.DisplayName; 
_bookSetViewModels.Insert(positionOfDisposedTab, emptyBook); 

これまでのところとても良いです。

しかし、後で私はemptyBookがBooksのプロパティも必要と認識しました。プロパティBooksはタイプDictionary<string, CustomClassItem>であるため、私はDisplayNameで行ったのと同じことをまず行うことができたと思いました。

emptyBook.Books = oldbook.Books; 

しかし、それはemptyBookがoldBookを参照することになるので、oldBookはゴミがもはや収集することができないことを意味ことができませんでしたか?

は、たぶん私はだけではなく、このように辞書のクローンを作成する必要があります

emptyBook.Books = book.Books.ToDictionary(entry => entry.Key, entry => entry.Value); 

目標:一日の終わりに、私がnullでないことをemptyBook洋書プロパティを必要とし、まだoldBook条ガベージコレクションをすることができます。何かご意見は?

+1

まだガベージコレクトされていますが、あなたが参照している辞書はまだ使用しているので収集されません。クラスにデストラクタを置いて、GC.Collect()を呼び出して、テストする場合にデストラクタが呼び出されるかどうかを調べることができます。 –

答えて

1

しかし、emptyBookがoldBookを参照しているため、古いブックはもうガベージコレクションできません。

いいえ、あなたが言及していないもの以外はありません。

あなたがここに持っているすべては同じBooks辞書を参照することを二つのオブジェクト(emptyBookoldbook)です。それはそれらの間に参照関係を作成しません。それぞれはもう片方を知る方法がありません。

oldbookがルートから別の参照を介して到達できない限り、ガベージコレクションの対象となります。

1

辞書からビューモデルクラスへの直接的または間接的な参照がない場合、問題はありません。

emptyBookとoldBookはどちらも同じ辞書を参照しますが、送信参照はガベージコレクションを停止していないため、着信接続のみがこれを行います。

0

私は、「美しさ」がTabControlであり、そのユーザーは常にを1つのタブでのみ動作させると考えています。複数のModelsがある、View Modelの1つがあるとします。 Tabを選択すると、モデルのコレクションから常にView Modelピックが正しいTradebookになります。Tab selection changedには、View Modelがアクティブなタブに割り当てられています。

0

Bookと本が指す辞書は2つの独立したオブジェクトです。 1つはちょうど他を参照します。

クラスのフィールドまたはプロパティを参照しても、そのフィールドまたはプロパティを含むクラスへの参照は作成されません。

oldbook.DisplayNameへの参照を格納する場合は、ディクショナリオブジェクトへの参照が格納されます。 oldbookが指し示すBookオブジェクトへの参照を格納していません。

ガベージコレクタが実行されると、あなたが辞書を参照していることがわかり、それを収集しません。あなたはBookを参照していないことがわかり、それを収集します。

これはもちろん、他の場所でBookオブジェクトを実際に参照していないことを前提としています。 oldbookがプロパティまたはフィールドと呼ばれるオブジェクトを持つクラスがなく、それをコンテナから削除した場合、またはBookを保持するコンテナが参照されなくなった場合、そのオブジェクトは収集されます。

関連する問題