Предотвращает ли самообработанное событие сборщик мусора? - PullRequest
3 голосов
/ 20 мая 2009

я прочитал ответ на вопрос Остановили ли обработчики событий сбор мусора? , но что происходит, когда целью является издатель?

Чтобы быть более точным, я использую дизайн MVVM для приложения WPF. Классы Model-View вызывают NotifyPropertyChanged при каждом изменении. В некоторых классах мне нужно вызывать метод, когда что-то изменяется.

Я хотел бы сделать это:

this.PropertyChanged += this.MyHandler;

Будут ли эти экземпляры уничтожены GC?

Ответы [ 3 ]

8 голосов
/ 20 мая 2009

GC смотрит и видит, есть ли какие-либо ссылки на объект в настоящее время в приложении. Он достаточно умен, чтобы обрабатывать циклические ссылки, подобные приведенным выше.

Кроме того, он достаточно умен, чтобы справиться со случаем, когда у вас есть два объекта, A и B, и:

A.Event += B.Handler; 
B.Event += A.Handler;

Если A и B оба выходят за рамки, GC достаточно умен, чтобы найти и очистить оба этих объекта, даже если они подписываются друг на друга. Однако, если отдельный объект (в использовании) ссылается на любой из них, это предотвратит сбор обоих.

Это одно из главных преимуществ настоящего решения ГХ по сравнению с решениями для подсчета ссылок. Подсчет ссылок не сможет собрать это, но .NET gc прекрасно с этим справится.

2 голосов
/ 20 мая 2009

Да, ГХ очистит объект, так как нет ничего внешнего для объекта, ссылающегося на него.

GC берет все ссылки, хранящиеся на корневом уровне (статические поля, ссылки в каждом стеке потоков и т. Д.), И переходит от них к объектам, на которые они могут ссылаться, а затем к объектам, на которые эти объекты могут ссылаться и так далее. Поскольку это идет, это отмечает каждый объект как "не быть собранным". После того, как он пробежал по ним, все, что еще не помечено как "не подлежит сбору", подлежит сбору.

Когда вы выполните это, GC не сможет добраться до вашего объекта из корня и, следовательно, он будет собран.

1 голос
/ 20 мая 2009

Да, ГХ достаточно умен, чтобы определять круговые ссылки и собирать вовлеченные объекты.

Он будет обрабатывать даже несколько объектов, поэтому, если objectA прослушивает событие на objectB, а objectB прослушивает событие на objectA, при условии, что они оба не ссылаются, GC обнаружит, что может собрать их обоих вместе.

(Лучшее, что я могу быстро найти для справки, это еще один вопрос здесь )

...