Вопрос

Я работаю над приложением Silverlight, используя шаблон MVVM.Моя ViewModel в настоящее время состоит из свойства, которое представляет коллекцию объектов модели:

public ObservableCollection<IndexEntry> IndexList
        {
            get;
            set;
        }

у него также есть несколько методов, которые будут заполнять эту коллекцию данными, возвращаемыми из веб-сервиса.

Поскольку экземпляры этого класса могут создаваться и уничтожаться в течение времени выполнения приложения, должен ли я реализовать IDisposable и установите ссылку на свойство в null или уничтожения этого класса будет достаточно, чтобы удалить все ссылки на коллекцию, на которую ссылается это свойство?Есть ли какие-либо предостережения, из-за которых ссылка может остаться висящей там?

Спасибо.

Это было полезно?

Решение

Единственный способ, которым ссылка выдерживает сборку мусора, - это если она укоренена.Если существует какой-либо другой класс, который все еще используется и который содержит ссылку на ObservableCollection , то ObservableCollection не будет уничтожен, независимо от того, присвоили ли вы ему значение null.Например, предположим, что есть один объект "в памяти", который является вашей коллекцией.У вас есть одна ссылка на это, в вашей собственности.Какой-то другой код выполняет строку "ObservableCollection<> myOtherReference = YourObject.Список индексов;".Теперь у них тоже есть ссылка на фактический объект memory.Обнуление ссылки на ваше свойство приведет только к удалению ссылки на ваше свойство;ссылка 'myOtherReference' остается неизменной, поскольку теперь она указывает непосредственно на память, а не на ваше свойство.Если вы действительно хотите удалить этот элемент из памяти, вам нужно удалить ВСЕ ссылки или реализовать некоторую решающую логику "dispose", в этот момент "myOtherReference" будет указателем на удаленный объект, и любой вызов к нему вызовет исключение.

Другие советы

ГВЛлоса попал в точку.Кроме того, привязка данных Silverlight сохранит вашу ViewModel закрепленной до тех пор, пока у вас есть привязка к ней.Другими словами, вам нужно будет либо удалить вашу ViewModel из DataContext представления (установив View.DataContext=null), либо ваше представление необходимо будет удалить из визуального дерева до того, как ваша ViewModel будет выпущена.Внедрение IDisposable не поможет, и я бы действительно не рекомендовал его для этого.IDisposable предназначен для очистки неуправляемых ресурсов или для получения большего контроля над удалением управляемых ресурсов.В данном случае в этом нет необходимости, если вы правильно понимаете, как работают привязки и ссылки, и просто позволяете сборщику мусора позаботиться обо всем.Эта статья могла бы помочь:

Поиск утечек памяти в приложениях WPF

В первую очередь это WPF, но вы также можете использовать методы Silverlight.

Кстати, приятно видеть, что вы используете ViewModel.Я большой поклонник этого шаблона.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top