OnNavigatedTo
私は好きなようにさまざまなイベントを購読しています
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Loaded += Screen_Loaded;
}
このイベントの登録を解除していません。このページが不要な場合、メモリの問題が発生しますか??
OnNavigatedTo
私は好きなようにさまざまなイベントを購読しています
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Loaded += Screen_Loaded;
}
このイベントの登録を解除していません。このページが不要な場合、メモリの問題が発生しますか??
いいえ。この場合、メモリリークを回避するためにサブスクライブを解除する必要はありません。その理由は、でイベントをサブスクライブするためですthis
。ガベージコレクタはこれを識別し、オブジェクトを解放する必要があります。
しかし、私は他の理由でまだ退会します。たとえば、リソースのバランスが取れていると、コードが読みやすくなります。また、OnNavigatedToが2回呼び出された場合はどうなりますか?(これが発生する可能性があるかどうかは実際にはわかりません)次に、同じメソッドへの2つのサブスクリプションがあります。このシナリオでのサブスクライブ解除は冗長なコードであると主張し、それを削除する人もいます。それ自体は正しいが、私はそのような議論に反対するだろう。
この短いスニペットを試して、自分で試してみることができます。注:GC.Collect()
この例のように、ファイナライザーを使用したり、GCについて学習したりすることを除いては絶対に使用しないでください。
public class Program
{
private class Foo
{
public event EventHandler FooChanged;
~Foo()
{
Console.WriteLine("Foo was collected");
}
public void Bar()
{
FooChanged += UpdateUI;
}
private void UpdateUI(object sender, EventArgs e)
{
}
}
public static void Main(string[] args)
{
var foo = new Foo();
foo.Bar();
foo = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("End of program");
Console.ReadKey();
}
}
はい、地下鉄アプリで自動的に発生する可能性のあるイベントの登録を解除する必要があります
例えば :
などのイベント
Window.Current.SizeChanged += Current_SizeChanged;
void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
{
//your code block contining various objects and logic
}
これらのイベントはバックグラウンドで発生しているため、ユーザーが制御することはできません。特定のページに関連していない可能性のあるイベント (上記のイベントが OnNavigatedTo イベントで初期化されていると仮定) の場合、OnNavigatedFrom などのイベントでそれを登録解除する必要があります。
さらに明確にするために、このイベントを初期化します
Window.Current.SizeChanged += Current_SizeChanged;
ブレークポイントを保持し、ウィンドウのサイズを横向きからスナップモードに変更するだけで、イベントのサブスクライブを解除していない限り、このイベントが発生します。
次のことを覚えておいてください。