XAML事件何时解除?

Chr*_*pel 3 wpf events memory-management windows-phone windows-phone-8

我目前正在开发一个使用图像很多的Windows Phone 8应用程序,因此保持低内存使用率是必须的.

为了确保内存使用率保持在低水平,我试图确保事件尽可能高效地解除,当然还有其他事情.

那么问题就变成哪种内存更有效?

在OnNavigatedTo和OnNavigatedFrom事件中执行挂钩/取消挂钩,如下所示:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    MyButton.Click += MyButton_Click(...)
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    MyButton.Click -= MyButton_Click(...)
}
Run Code Online (Sandbox Code Playgroud)

或者是xaml足够智能取消挂起在xaml中定义的事件,如下所示:

<Button x:Name="MyButton" Click="MyButton_Click"/>
Run Code Online (Sandbox Code Playgroud)

页面被导航后?

McG*_*gle 5

在您列出的场景中 - 在代码隐藏中具有事件处理程序的XAML文件 - 事件所有者和处理程序都属于同一(部分)类.这意味着,您不必担心显式删除事件处理程序.一旦页面被卸载(导航自),它就有资格进行垃圾收集.

内存泄漏成为问题的场景是:

  1. 事件处理程序和事件本身由不同的对象拥有
  2. 事件的所有者是长寿的,并且处理程序的所有者是短暂的

在这种情况下,由于订阅事件导致事件所有者持有对处理程序所有者的引用,因此它会阻止后者被垃圾回收.这是弱事件有用的地方 - 弱事件引用允许处理程序对象被垃圾收集,如果剩下的唯一引用是弱事件侦听器.