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 に答える