64

これは悪い習慣かもしれませんが、私が読んだドキュメントから、場合によってはviewDidLoadメソッド内でオブジェクトを初期化し、viewDidUnloadでそれをゼロにするというアドバイスを得ました。

たとえば、オブザーバーを追加するようなものがある場合

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(filterready:)
                                                 name:@"filterReady"
                                               object:nil];

現在、オブザーバーを削除するメソッドはありませんが、ビューが表示されるたびにviewDidLoadが呼び出されるため、しばらくすると複数のオブザーバーが実行され、セレクターが複数回呼び出されます。

いくつかのクリーナーをviewDidDisappearメソッドに移動することでこれを修正できますが、正しいことをしているのかどうか疑問があります。

私のサンプルでは、​​サブナビゲーションを制御している複数のナビゲーションコントローラーがありますが、参照されていなくても、deallocが呼び出されることはありません。

4

4 に答える 4

110

- (void)didReceiveMemoryWarning メソッドと メソッドを使用する必要が あり- (void)deallocます。

iOS 6 では、UIViewController の viewWillUnload および viewDidUnload メソッドは非推奨になりました。これらのメソッドを使用してデータを解放していた場合は、代わりに didReceiveMemoryWarning メソッドを使用してください。このメソッドを使用して、View Controller のビューが使用されていない場合に参照を解放することもできます。これを行う前に、ビューがウィンドウ内にないことをテストする必要があります。

したがって、ビューが最初にウィンドウ内にあるかどうかを確認してから、オブザーバーを削除する必要がありますdidReceiveMemoryWarning

于 2012-09-26T14:04:08.540 に答える
16

まず、 が廃止されていない場合でも、その通知をANDviewDidUnloadで登録解除する必要があったはずです。iOS 6 より前でも、ほとんどの状況で呼び出されません。メモリ不足の状況でのみ。そのため、以前ではなく、入れただけであれば、登録解除されず、割り当てが解除されて通知を受け取ったときにクラッシュした可能性があります。したがって、正しく機能するためには、以前にそれを挿入する必要があったに違いありません。viewDidUnloaddeallocviewDidUnloadviewDidUnloaddeallocdealloc

第 2 に、以前に正しく行っていた場合、iOS 6 で正しく動作させるために特別なことをする必要はありません。つまり、メモリ不足の状況に陥らなかった iOS 5 と同じです。ビューはアンロードされないviewDidLoadため、一度だけ呼び出されるため、通知は一度だけ登録されます。dealloc正しく機能するためには、あなたがそれを置いたに違いないので、それは で登録解除されます。

于 2012-10-31T00:04:32.130 に答える
10

アレックスの答えは良いです。しかし、私は適切なペアリングが好きです。そのため、ビューが表示されていないときに通知する必要がない限り、通常は viewWillAppear と viewDidDisappear に通知を追加します。

于 2012-10-29T11:30:50.927 に答える
5

DEALLOC関数でオブザーバーを削除しないのはなぜですか? また、ARC を使用している場合は、[super dealloc] を呼び出さないでください。

コントローラーの dealloc 関数が呼び出されていない場合は、その理由を突き止める必要があります。おそらく、ViewController で NSTimer を実行していて、ビューをポップすると、dealloc が呼び出されないことがあります。または、他の場所でビューが保持されています。

于 2012-09-26T13:56:28.137 に答える