1

私は、かなり複雑なストーリーボード ベースの iPad アプリを使用しています。私のワークフローは次のとおりです コレクション ビューは別のビューをプッシュし、別のビューをモーダルに表示します。

モーダルに表示される 3 番目のビューはかなり複雑で、19 のサブビューがあり、そのうちのいくつかはイメージ ビューです。アプリは、viewDidLoad 内のビュー階層を整理するために多くのことを行います。viewWillAppear または viewDidAppear 内には他に何もありません。

私が気になるのは、viewDidLoad 内にロギング ステートメントを配置すると、ユーザーがストーリーボード セグエを開始してから 1.5 秒以内に viewDidLoad が完了することがわかります。次に、viewWillAppear が呼び出されます。その後、画面は 3 秒から 80 秒 (そうです、80 秒です!) の間そこにとどまります。ビューが比較的速く表示される場合もあれば、長い時間がかかる場合もあります。

これは、viewDidLoad のメモリ消費量が多すぎることの症状ですか? 言い換えれば、iOS がビューを表示するのに十分なメモリをクリーンアップするための遅延ですか?

xCode で停止ボタンを押した後、アプリを再起動し、一連の手順を実行して View Controller を表示します。最初の実行は次のとおりです。

/

/80 seconds!
    2013-03-27 22:56:30.311 iconmaker[2076:907] -[GLFirstViewController viewWillAppear:] [Line 597] viewWillAppear
    2013-03-27 22:57:50.351 iconmaker[2076:907] -[GLFirstViewController viewDidAppear:] [Line 604] viewDidAppear

//after popping the view controller and repeating:
//less than 2 seconds
2013-03-27 22:59:23.698 iconmaker[2076:907] -[GLFirstViewController viewWillAppear:] [Line 597] viewWillAppear
2013-03-27 22:59:24.306 iconmaker[2076:907] -[GLFirstViewController viewDidAppear:] [Line 604] viewDidAppear

更新: デバイスの電源をオフにしてから再起動すると、View Controller は非常に高速に表示され、最初の実行では再び 2 秒未満で表示されます。コントローラーを 4 回押したりポップしたりした後の割り当てのプロファイリングを次に示します。

ここに画像の説明を入力

これはメモリ解放の問題ですか?

4

1 に答える 1

1

アプリのプロファイリングを行った後、次の 2 つの問題が発生していることがわかりました。

1) 大きな UIImages をバイナリデータとして coredata に保存していましたが、NSFetchedResultsControllers が使用されている場合は、すべての画像データを引き出してメモリに保持しているため、これを行うべきではありません。

2) iOS6 では viewDidUnload の動作方法が変更されました。呼び出されることはないため、ビュー コントローラーが消えたときにオブジェクトを手動で解放するための呼び出しをいくつか追加しました。

最終的な結果として、メモリ フットプリントは現在約 4 MB のベースラインであり、以前に問題を起こしていたコントローラーを押すと高くなります。さらに、メモリ不足でクラッシュすることなく、コントローラーを複数回プッシュ/ポップできます。

ここに画像の説明を入力

于 2013-04-01T04:07:05.043 に答える