我目前正在开发一个大量使用图像的 Windows Phone 8 应用程序,因此必须保持较低的内存使用量。
为了确保内存使用量保持在较低水平,我试图确保事件尽可能高效地脱钩,当然还有其他事情。
所以问题是哪个内存效率更高?
在 OnNavigedTo 和 OnNavigedFrom 事件中进行 Hook /取消 Hook ,如下所示:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
MyButton.Click += MyButton_Click(...)
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
MyButton.Click -= MyButton_Click(...)
}
或者 xaml 是否足够智能,可以取消 xaml 中定义的事件,如下所示:
<Button x:Name="MyButton" Click="MyButton_Click"/>
页面被导航离开后?
最佳答案
在您列出的场景中——代码隐藏中带有事件处理程序的 XAML 文件——事件所有者和处理程序都属于同一个(部分)类。这意味着,您不必担心显式删除事件处理程序。一旦页面被卸载(从中导航),它就应该有资格进行垃圾收集。
内存泄漏成为问题的场景是:
- 事件处理程序和事件本身由不同的对象拥有
- 事件的所有者是长期存在的,而处理程序的所有者是短暂的
在这种情况下,由于订阅的事件导致事件所有者持有对处理程序所有者的引用,因此它会阻止后者被垃圾收集。这就是weak events很有用——如果唯一剩下的引用是弱事件监听器,则弱事件引用允许对处理程序对象进行垃圾收集。
关于wpf - XAML 事件何时解除 Hook ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337860/