3

私はiPad用のインタラクティブな本を作成していてUINavigationController、ページと次のページの間のナビゲーションを実装するために使用しています。ユーザーがページをめくると、次のページがナビゲーションスタックの一番上にプッシュされます。

アプリを15ページ表示しましたが、14ページから15ページに移動しようとすると、アプリがクラッシュします。コンソールにエラーメッセージが表示されず、デバイスのクラッシュログにも何も表示されません。

ストーリーボード内の各ビューコントローラのシーンにはUIImageViews、5MBから20MBの画像が表示されます。ビューコントローラのviewDidLoadメソッドは一度だけ呼び出されます。すべてのアプリのアセットの合計サイズは200億未満です。ARCを使用しています。

Instrumentsのメモリモニターを使用してアプリを実行しました。アプリのリアルメモリ消費量は、新しいページがめくられるたびに約80MB増加し、800MBに達するとクラッシュします(デバイスはiPad 3です)。

  • なぜこんなに膨大なメモリを消費するのでしょうか?これは、ストーリーボードのシーンのUIImageViewが画像をキャッシュするためですか?

  • UINavigationControllerとARCを使用する場合、メモリを解放するための最良の方法は何でしょう か。

ビューコントローラのメソッドですべてのビューコントローラのサブビューをnilに設定して追加しようとしましたviewDidDisappear:が、メモリ消費量は同じままでした。

4

2 に答える 2

7

UINavigationController を使用すると、ユーザーがその特定の ViewController で戻るボタンを押さない限り、プッシュした各 ViewController は永久に (つまり、アプリが終了するまで) メモリに残ります。ViewControllers のスタックを保持します - 目に見えるものを一番上に置きます。

したがって、簡単な答えは、 this に UINavigationController を使用しないことです。次のページと前のページを「認識」し、必要に応じてそれらを手動でロードおよび削除する独自のViewControllerを構築することをお勧めします。このようにして、メモリ内に一度に 1 つのページしか持たないようにすることができます (トランジション中を除く - トランジションhttp://cocoacontrols.com/platforms/ios/controls/xbpagecurlにこのアニメーションを使用できるかもしれません)。

于 2012-06-25T20:38:05.543 に答える
2

おそらく、この目的で UINavigationController を使用したくないでしょう。1 つのビュー コントローラーですべてのページを管理し、古いページを削除しながら同じビューで新しいページをレンダリングすることが本当に必要です。

于 2012-06-25T20:34:49.987 に答える