3

我目前正在开发一个大量使用图像的 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(...)
}

或者 xaml 是否足够聪明,可以像这样解开在 xaml 中定义的事件:

<Button x:Name="MyButton" Click="MyButton_Click"/>

在页面被导航离开之后?

4

1 回答 1

5

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

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

  1. 事件处理程序和事件本身属于不同的对象
  2. 事件的所有者是长寿命的,处理程序的所有者是短寿命的

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

于 2013-10-12T18:50:58.063 回答