私はキオスクアプリを持っています。これは基本的に、さまざまな情報を含む一連のスライドを表示します。私がこれをコーディングし始めたのは、Objective-C と iOS の開発を始めた 1 年以上前のことです。私のコード スタイルは、以前よりもはるかにクリーンになりました。経験も豊富になったので、ゼロから書き直すことにしました。
Allocations インストルメントを使用してアプリを実行し、メモリ使用量を確認しました。これがキオスクアプリであることを考えると、すべてがリークなしでスムーズに実行される必要があります. (もちろん、すべてのアプリはリークなしで実行する必要がありますが、キオスク アプリではこれがさらに重要な目標になります。) 興味深い結果が得られたので、古いバージョンのコードも実行しました。
古いバージョンのコードを実行すると、約 1.15 メガバイトのメモリ使用量でほぼ均一に実行されます。すべてが必要に応じて割り当てられ、割り当て解除されているようです。しかし、私の新しい実装では、少し違うものを見ています。メモリ使用量は、小さな「プラトー」で急増し続け、最終的には約 1.47 メガバイトの使用量でピークに達するようです。10 時間以上実行した後の新しい割り当てレポートは次のようになります。
私はいくつかの理由で心配しています。
- 走り始めの変なパターン。
- 割り当ては 1.47 メガバイトでピークに達しているように見えますが、一晩実行すると、時間の経過とともにメモリの使用量が徐々に増えていくことがわかります。それは良いことではありません。
古いプロジェクトと新しいプロジェクトの間には、いくつかの顕著な違いがあります。
古いものはバッキング ストアとして Plists を使用します (手動で plist ファイルを読み書きします)。新しいプロジェクトは Core Data を使用します。
新しいプロジェクトは、古いプロジェクトにはなかった各「スライド」で呼び出されるライブラリを実装します。このライブラリについては、私が作成し、すべてをリリースしていることを確認し、手動リリースが不可能な場合にのみ自動リリースされていることを確認したことを除いて、このライブラリについてもっと心配しています。
どちらのクラスもファクトリ クラスを使用してスライドを作成します。古いプロジェクトでは、ファクトリ クラスはシングルトンでした。シングルトンがリリースされたことがないため、通常のクラスにすることでメモリの問題が解決されると思いました。(したがって、その プロパティは解放されていませんでした。新しいプロジェクトでは、ファクトリ クラスが解放されているため、なぜまだすべてのメモリを占有しているのかわかりません (それが問題の原因である場合.
古いプロジェクトでは、さまざまな場所で文字列定数を使用しています。新しいコードは、同じことに対して大規模な列挙型を使用します。(一般に、新しいコードはより多くの定数を使用します。)
メモリのピークを追跡するにはどうすればよいですか? メモリは、使用しているものを破棄するときにアプリケーションによってすべてクリーンアップされますが、アプリが終了するまでは破棄されないようです。
誰かが私を正しい方向に向けるのを手伝ってくれたら幸いです。
編集:
ピーキングは、 KosherCocoaライブラリへの呼び出しによって引き起こされているようです。誰かがそれを見て、メモリ管理に関する限り、私が間違っていることを教えてくれれば、本当に感謝しています。