情報
最近、AppStore でアプリをリリースしました。シミュレーターで数千回、実際のデバイスで数百回テストした後、最終的にアプリをリリースしました。
問題
ユーザーがアプリを起動すると、アプリのクラッシュに関するレビューがポップアップし始めました。RAM が 256 Mb 以下の iOS デバイスでは、起動時にアプリがクラッシュすることがわかりました。次のデバイスは、アプリがサポートする 256 未満のデバイスです。
- iPodタッチ4G
- iPhone 3GS
- iPad 1
アプリは常にクラッシュするとは限りません。時々、うまく起動してスムーズに実行されます。それ以外の場合はクラッシュします。起動 (ユーザーがアイコンをタップしたとき) からクラッシュまでの時間は通常 2 秒です。これは、システムがシャットダウンしていないことを意味します。
所見
Instruments を使用して特定のデバイスをテストすると、次のことがわかります。
- メモリ リークはありませんが (ARC を使用しています)、メモリ警告があります。
- アイテムは狂ったように割り当てられています。割り当てられたアイテムが非常に多く、ARCを使用していても、ARCが本来のことをしていないようです
「過剰割り当て」と見なされるため、結果は次のようになります。
このアプリは (平均で) 60 MB の実メモリと 166 MB の仮想メモリを必要とします。アプリが起動すると、使用されるメモリが急速に増加し、約 60 MB に達し、その時点でビューが読み込まれます。以下は、Instruments のアクティビティ モニターのスナップショットです。
これらの数値が非常に高いことはわかっています (ただし、CPU % は実際にそこまで上昇することはありません)。ARC が適切に機能していないのではないかと心配しています。それよりも可能性が高いのは、オブジェクトを正しく割り当てていないことです。何が起こっている可能性がありますか?
コードと警告
Xcode では、アプリの起動やアプリの起動に関連するファイルに関連する警告はほとんどありません。App Delegate とviewDidLoad
メソッドの両方にブレークポイントを配置して、そこでクラッシュが発生したかどうかを確認しましたが、発生していませんでした。
その他の背景情報
また、Xcode はデバッガーでエラーやメッセージを生成しません。iTunes Connect にもクラッシュ レポートはなく、「レポートを表示するには送信されたレポートが少なすぎます」と表示されるだけです。アプリにクラッシュ レポートを追加しましたが、そのバージョンをリリースしていません。
いくつかの質問
私は ARC が到着したときに Obj-C を使い始めたので、メモリ、割り当てなどを扱うのは初めてです (それはおそらく明らかです) が、いくつかのことを知りたいです@autoreleasepool
:影響?didRecieveMemoryWarning
ARC を使用しているため、メモリの警告はどうすればよいですか? NSLog ステートメントを削除すると、スピードアップに役立ちますか?
そして最も重要な質問:
アプリが大量のメモリを消費するのはなぜですか? また、なんと 60 MB のフットプリントを削減するにはどうすればよいでしょうか?
助けていただければ幸いです。前もって感謝します!
編集: iPhone 4 (A4) でテストした後、RAM が 256 MB 未満のデバイスではアプリを実行してもクラッシュしないことがわかりました。