10

私はキオスクアプリを持っています。これは基本的に、さまざまな情報を含む一連のスライドを表示します。私がこれをコーディングし始めたのは、Objective-C と iOS の開発を始めた 1 年以上前のことです。私のコード スタイルは、以前よりもはるかにクリーンになりました。経験も豊富になったので、ゼロから書き直すことにしました。

Allocations インストルメントを使用してアプリを実行し、メモリ使用量を確認しました。これがキオスクアプリであることを考えると、すべてがリークなしでスムーズに実行される必要があります. (もちろん、すべてのアプリはリークなしで実行する必要がありますが、キオスク アプリではこれがさらに重要な目標になります。) 興味深い結果が得られたので、古いバージョンのコードも実行しました。

古いバージョンのコードを実行すると、約 1.15 メガバイトのメモリ使用量でほぼ均一に実行されます。すべてが必要に応じて割り当てられ、割り当て解除されているようです。しかし、私の新しい実装では、少し違うものを見ています。メモリ使用量は、小さな「プラトー」で急増し続け、最終的には約 1.47 メガバイトの使用量でピークに達するようです。10 時間以上実行した後の新しい割り当てレポートは次のようになります。

ここに画像の説明を入力

私はいくつかの理由で心配しています。

  1. 走り始めの変なパターン。
  2. 割り当ては 1.47 メガバイトでピークに達しているように見えますが、一晩実行すると、時間の経過とともにメモリの使用量が徐々に増えていくことがわかります。それは良いことではありません。

古いプロジェクトと新しいプロジェクトの間には、いくつかの顕著な違いがあります。

  • 古いものはバッキング ストアとして Plists を使用します (手動で plist ファイルを読み書きします)。新しいプロジェクトは Core Data を使用します。

  • 新しいプロジェクトは、古いプロジェクトにはなかった各「スライド」で呼び出されるライブラリを実装します。このライブラリについては、私が作成し、すべてをリリースしていることを確認し、手動リリースが不可能な場合にのみ自動リリースされていることを確認したことを除いて、このライブラリについてもっと心配しています。

  • どちらのクラスもファクトリ クラスを使用してスライドを作成します。古いプロジェクトでは、ファクトリ クラスはシングルトンでした。シングルトンがリリースされたことがないため、通常のクラスにすることでメモリの問題が解決されると思いました。(したがって、その プロパティは解放されていませんでした。新しいプロジェクトでは、ファクトリ クラスが解放されているため、なぜまだすべてのメモリを占有しているのかわかりません (それが問題の原因である場合.

  • 古いプロジェクトでは、さまざまな場所で文字列定数を使用しています。新しいコードは、同じことに対して大規模な列挙型を使用します。(一般に、新しいコードはより多くの定数を使用します。)

メモリのピークを追跡するにはどうすればよいですか? メモリは、使用しているものを破棄するときにアプリケーションによってすべてクリーンアップされますが、アプリが終了するまでは破棄されないようです。

誰かが私を正しい方向に向けるのを手伝ってくれたら幸いです。

編集:

ピーキングは、 KosherCocoaライブラリへの呼び出しによって引き起こされているようです誰かがそれを見て、メモリ管理に関する限り、私が間違っていることを教えてくれれば、本当に感謝しています。

4

1 に答える 1

5

メモリのピークを追跡するにはどうすればよいですか? アプリケーションが使用しているものを破棄すると、メモリはすべてアプリケーションによってクリーンアップされますが、破棄しているようには見えません。

これは、「放棄されたオブジェクト」または「使用の増加」の典型的なケースです。つまり、実行時に通常の使用方法としてメモリ内にオブジェクト グラフを作成するアプリケーションがあるとします。オブジェクトはまだライブ オブジェクト グラフに接続されているため、リークされません。ほとんどの場合、オブジェクトは何らかのキャッシュ (ほとんどの場合は書き込み専用キャッシュ) の一部であるか、履歴状態に関係するメカニズムの一部です (元に戻すスタックは、増加の潜在的なソースです)。

これを修正するには、アプリの実行時にオブジェクト グラフが適切にプルーニングされるようにする必要があります。キャッシュは一般に、キャッシュ サイズを制限する、最近使用されていない [LRU] プルーニング アルゴリズムを使用する必要があります。キャッシュ キーが無効になった場合は、そのデータもプルーニングする必要があります。

履歴情報については、履歴の整理が重要です。履歴データにその履歴状態の最小限の表現が含まれていることを確認することも同様です。

ヒープショット分析を使用してください。これは、この種の問題を正確に追跡するために作成されました。

詳細な「ハウツー」ガイドを書きました。 リークがリークではないのはいつですか?

于 2011-08-01T14:46:21.750 に答える