0

現在表示されているビューコントローラー(スーパービュー!= nil)がアンロードされているときにメモリ警告を処理する方法について、私は完全に混乱しています。セットアップは、rootViewController としての tabbarcontroller、ビュー コントローラーを含むナビゲーション コントローラー、たとえばビュー コントローラー A です。ビュー コントローラー B をビュー コントローラー A のナビゲーション スタックにプッシュします。メモリ警告をシミュレートします。

1) ビュー コントローラー A はメモリ警告を受け取り、そのビューはアンロードされますが、すべて問題ありません。

2) ビュー コントローラー B (現在表示されている) にメモリ警告が表示されます。そのスーパービューを印刷します。ナビコントローラーの

(gdb) po [[self view] superview]
<UIViewControllerWrapperView: 0x12310c80; frame = (0 64; 1024 655); autoresize = W+H;     layer = <CALayer: 0x12310cb0>>>
(gdb) po [self navigationController]
<UINavigationController: 0x714efd0>
(gdb) po [[[self navigationController] view] superview]
<UIViewControllerWrapperView: 0x740b0c0; frame = (0 0; 1024 719); autoresize = W+H; layer = <CALayer: 0x740b140>>

 /*** can you see how desperate i am? : ) ***/
(gdb) po [[[[[self view] window] rootViewController] view] superview]
<UIWindow: 0x7162910; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7163660>> 

3) 私が次に知っていることは、目に見えるビュー コントローラーのビューがアンロードされていることです (ビュー コントローラーの viewDidUnload メソッドのブレークポイントがヒットします)。

私は現在このView Controllerを見ているので、戻ってナビゲートしない限り、そのviewDidLoadは再び呼び出されることはありません。これは、superview != nil のときにビューがアンロードされない!という多くの投稿と矛盾しているようで、スタック全体を調査しました!

明確にするために、viewDidUnloadで何をすべきか、または解放するデータの種類などを尋ねていません。フレームワークが、明らかにまだビュー階層の一部であるビューコントローラーにdidReceiveMemoryWarningを送信している理由を理解しようとしています。

考え?

4

2 に答える 2

-1

ここであなたの質問に答えるために、Appleテンプレートからのメソッドスタブがあります

- (void)didReceiveMemoryWarning
{
  // Releases the view if it doesn't have a superview.
  [super didReceiveMemoryWarning];

  // Release any cached data, images, etc that aren't in use.
}

これは、ビューが表示されているからといって、割り当てられているすべてのリソースを使用しているとは限らないため、メモリを解放できるようにするためです。

于 2011-07-10T16:13:31.973 に答える
-1

ビューコントローラは、メモリを大量に消費する可能性があるため、メモリを解放する必要があるため、メモリ警告を受け取ります。ユーザーが操作する可能性のあるデータのキャッシュがあり、必要に応じて再ロードできるとしましょう。memが不足しているためにクラッシュするよりも、オンデマンドで再ロードする方がよいため、これをdidReceiveMemoryWarningにダンプすることをお勧めします。ただし、didReceiveMemoryWarningでユーザーが現在操作しているビューやその他のものを解放しないでください。解放しないと、表示されている動作が表示されます。

さらに、Paul.sの回答のスタブが示すように、ビューコントローラは、実際に表示されていないときにメモリ警告を受け取るため、ビューを解放しても安全です。ただし、すでにそこで処理されているので、(示されているように)スーパーの実装に任せます。

メモリ警告を受け取ったときにビュー(またはその一部)を解放していますか?その場合は、代わりにそのコードをviewDidUnloadに移動する必要があります。

于 2011-07-10T17:49:40.420 に答える