4

情報

最近、AppStore でアプリをリリースしました。シミュレーターで数千回、実際のデバイスで数百回テストした後、最終的にアプリをリリースしました。

問題

ユーザーがアプリを起動すると、アプリのクラッシュに関するレビューがポップアップし始めました。RAM が 256 Mb 以下の iOS デバイスでは、起動時にアプリがクラッシュすることがわかりました。次のデバイスは、アプリがサポートする 256 未満のデバイスです。

  • iPodタッチ4G
  • iPhone 3GS
  • iPad 1

アプリは常にクラッシュするとは限りません。時々、うまく起動してスムーズに実行されます。それ以外の場合はクラッシュします。起動 (ユーザーがアイコンをタップしたとき) からクラッシュまでの時間は通常 2 秒です。これは、システムがシャットダウンしていないことを意味します。

所見

Instruments を使用して特定のデバイスをテストすると、次のことがわかります。

  1. メモリ リークはありませんが (ARC を使用しています)、メモリ警告があります。
  2. アイテムは狂ったように割り当てられています。割り当てられたアイテムが非常に多く、ARCを使用していても、ARCが本来のことをしていないようです
  3. 「過剰割り当て」と見なされるため、結果は次のようになります。

    このアプリは (平均で) 60 MB の実メモリと 166 MB の仮想メモリを必要とします。アプリが起動すると、使用されるメモリが急速に増加し、約 60 MB に達し、その時点でビューが読み込まれます。以下は、Instruments のアクティビティ モニターのスナップショットです。 ここに画像の説明を入力

これらの数値が非常に高いことはわかっています (ただし、CPU % は実際にそこまで上昇することはありません)。ARC が適切に機能していないのではないかと心配しています。それよりも可能性が高いのは、オブジェクトを正しく割り当てていないことです。何が起こっている可能性がありますか?

コードと警告

Xcode では、アプリの起動やアプリの起動に関連するファイルに関連する警告はほとんどありません。App Delegate とviewDidLoadメソッドの両方にブレークポイントを配置して、そこでクラッシュが発生したかどうかを確認しましたが、発生していませんでした。

その他の背景情報

また、Xcode はデバッガーでエラーやメッセージを生成しません。iTunes Connect にもクラッシュ レポートはなく、「レポートを表示するには送信されたレポートが少なすぎます」と表示されるだけです。アプリにクラッシュ レポートを追加しましたが、そのバージョンをリリースしていません。

いくつかの質問

私は ARC が到着したときに Obj-C を使い始めたので、メモリ、割り当てなどを扱うのは初めてです (それはおそらく明らかです) が、いくつかのことを知りたいです@autoreleasepool:影響?didRecieveMemoryWarningARC を使用しているため、メモリの警告はどうすればよいですか? NSLog ステートメントを削除すると、スピードアップに役立ちますか?

そして最も重要な質問:

アプリが大量のメモリを消費するのはなぜですか? また、なんと 60 MB のフットプリントを削減するにはどうすればよいでしょうか?

助けていただければ幸いです。前もって感謝します!

編集: iPhone 4 (A4) でテストした後、RAM が 256 MB 未満のデバイスではアプリを実行してもクラッシュしないことがわかりました。

4

1 に答える 1

6

私は最終的に問題を解決しました。なぜ自分のアプリケーションが Angry Birds や Doodle Jump よりも多くの RAM を消費するのか、数時間考えてみました。私のアプリはCALayer Drawing、複雑なOpen GL Graphics Rendering、または重いWeb接続を行わないため、それは意味がありませんでした.

回答を探しているときにこのスライドショーを見つけ、スライド 17 にメモリ フットプリントを削減する方法を示しました。際立っていたのは PNGCrush (Graphics Compression) でした。

私のアプリには多くのカスタム グラフィックス (PNG ファイル) が含まれていますが、それらがアプリに何らかの影響を与えるとは考えていませんでした。明らかに、画像 (適切に最適化されていない場合) によってアプリケーションのメモリ フットプリントが大幅に増加します

PNGCrushをインストールし、特に大きな画像 (3.2 MB) で使用してから、未使用の画像をいくつか削除した後、アプリのメモリ使用量を 60 MB 以上の重度の遅延から 35 MB に減らし、遅延はありませんでした。なんと5分かかりました。

すべての画像の「粉砕」はまだ完了していませんが、完了したら、最終的なメモリ フットプリントについて全員に更新します。

興味のある方は、PNGCrush のインストール方法を説明しているブログへのリンクをご覧ください(かなり複雑です)。

更新: PNGCrush プロセスを使用する代わりに (多くの画像では時間がかかりますが、非常に役立ちます)、PNGCrush のような複数のスクリプトに GUI を提供するImageOptimというプログラムを使用しています。簡単な説明を次に示します。

ImageOptim は、PNGOUT、AdvPNG、 PNGCrush、拡張 OptiPNG、JpegOptim、jpegrescan、jpegtran、Gifsicle などのさまざまな最適化ツールをシームレスに統合します。

OS X 10.6 - 10.8 を無料でダウンロードできる Web サイトへのリンクを次に示します。私はこのソフトウェアの開発者、発行者、または広告主ではありません。

于 2012-07-05T17:19:40.760 に答える