我现在WPF
编码中有一些内容可能导致Memory leaks
。比如删除对象包含在长寿命资源中订阅的事件处理程序。在这方面,我已阅读this article。
现在,我的问题是:
如果我们的资源是ViewModel
,我们会将其保存在Static
对象中并将其提供给Window
DataContext
或DataContext
个UserControl
1}}在Window
内,当我们想要Close
我们的Window
时,我们应该所有以下作品来阻止Memory leaks
吗? :
EventHandlers
的所有 Window
或UserControl
活动中的ViewModel
Elements Properties
解除绑定到ViewModel
manualy Commands
解除绑定到ViewModel
manualy 如果答案是肯定的,那么您在一种或多种方法中自动完成这些工作的建议方式是什么,然后在Window Closing
上调用它们。
答案 0 :(得分:2)
是。如果窗口订阅了VM事件,则VM将保留对订户的引用。请注意,这不是WPF独有的,任何静态对象都将保存这样的事件引用。如果您不想手动取消订阅,则可以使用Weak Event Pattern。一般来说,我发现只需取消订阅即可。
不,通常您不必担心绑定。唯一的情况是绑定对象不是DependencyProperty或实现INotifyPropertyChanged的东西。因为在MVVM中,您通常绑定到VM属性,而VM实现INPC就可以了。
出于这个原因,最好始终在您的VM中实施INPC,即使您从未触发它。我过去曾经遇到过泄漏问题,因为VM属性在构建之后永远不会改变。
唯一需要注意的是文章中给出的例子,例如Count。但是,这些很少给我带来麻烦。如果您确实发现内存泄漏,那么您可以使用this answer中列出的工具来查找罪魁祸首。