0

作業中の iPad アプリにメモリの問題があります。3 つのビュー コントローラーとナビゲーション コントローラーしかありません。ビュー コントローラーを A から B にプッシュ セグエで交換し、次に C にプッシュ セグエで交換し、次に popToRootViewController 命令で再び A に交換します。

何が起こるかを知るために、すべてのビューコントローラーに didReceiveMemoryWarning を実装しました。ビュー B はメモリから正しくアンロードされますが、ビュー C はそれ自体を複製してメモリを消費するようです! メモリ警告をトリガーすると、いくつかのビュー C が応答していることがわかります...

すべての親参照を弱いと宣言したため、循環保持のようには見えません。また、リーク インストルメントはリークを検出せず、サイクルも保持せず、メモリが増加するためです。
これにより、実際の iPad でテストするとクラッシュが発生します。

私に何ができる ?どこで見ることができますか?ナビゲーションコントローラーに、以前のオブジェクトをすべて解放するように依頼することはできますか?ただし、現在の画面上のオブジェクトは解放されますか?

編集 :

ビューのdidloadで、以下のようにいくつかのオブザーバーを追加しました:

 NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(undoManagerDidUndo:) name:NSUndoManagerDidUndoChangeNotification object:undoManager];
[dnc addObserver:self selector:@selector(undoManagerDidRedo:) name:NSUndoManagerDidRedoChangeNotification object:undoManager];

これを行うと、dnc が自己への参照をどこかに保持する可能性はありますか?

4

1 に答える 1

1

ARC を使用している場合は、それらを nil する必要はありません。それらへの強力なポインターがなくなると、ARC はそれらを自動的に解放する必要があります。どちらが保持しているかを確認する方法がわかりません。あるのかもしれませんが、調べてみましたが、方法が見つかりません。すべての GestureRecognizers とその他のものを削除して、ロックを解除する必要があります。

于 2012-06-07T18:47:32.623 に答える