2009-05-28 17 views
3

Ok ......iPhoneメモリ管理didReceiveMemoryWarning

私はiPhoneで簡単なOpenGL ESアプリケーションを実装していますが、最近Pinch Media Analyticsに追加しました。これを行うことで、メモリ管理の問題が明らかになりました。私はそれに対処する方法が完全にはわかりません。

完璧な世界では、didFinishLoadingでPNGと.CAFファイルをロードするアプリケーションが起動し、そのすべてのリソースをロードして正常に動作します。

私のプログラムがクラッシュ(私がピンチメディアライブラリを統合していたときに起こった)があった場合や、Safariを起動してたくさんのページを開いてゲームを起動した場合、それは記憶不足です。

この問題は、システムをハードリセットするまで続きます。

ソートのオンラインで入手デフォルトの回答は、下記のよう....

- (void)didReceiveMemoryWarning 
{ 
    // default behavior is to release the view if it doesn't have a superview. 

    // remember to clean up anything outside of this view's scope, such as 
    // data cached in the class instance and other global data. 
    [super didReceiveMemoryWarning]; 
} 

をdidReceiveMemoryWarningメソッドを実装することである。しかし、それはメモリ上に保持されている他のプログラムをだとして、これは本当に助けにはなりません私のじゃない。私は自分の見解を発表したくないのですか?この状況を処理する方法や、didReceiveMemoryWarningイベントで何が起こるのかについての良い説明はありますか?

答えて

2

ビューが1つしかない場合は、使用していないデータをすべて解放し、後でそれらを読み込むことが唯一可能です。

ビューが複数ある場合は、表示されていない場合は解放される可能性があります。この場合、対応するコントローラにsetView:nilが送信されます。この問題は、すべてのIBOutlet変数を直ちに解放して、ビューが再びxibからロードされたときに正しく設定されるようにします。

これは、ナビゲーションビューで4レベルの深さであっても、以前のすべてのコントローラのビューがnilに設定されていても、ビューが6よりも大きい通常の非OpenGL ESアプリケーションで、後方にナビゲートするとクラッシュすることはありませんが、ビューが再ロードされると遅延が発生します。

まだ見つからない場合、シミュレータにメモリ警告をシミュレートするメニュー項目があります。これは、実際のデバイスで条件が発生するよりも簡単です。つまり、実際のデバイスで同じシナリオをテストすることに代わるものではなく、テストを簡単にするだけです。

+0

ありがとうございました。これは1つのビューしかないので、私は遅延ロードメソッドを試してみます。 – K2Digital

5

VMなしの共有メモリプールへようこそ。ここではできることはたくさんありますが、いくつかのことがあります(実際には自分の過ちであり、完全に修正できる可能性があります)。ゲーム開発者は、このような理由で実行する前に顧客の再起動を推奨することが多いため、実際には多くのメモリを有効にする必要がある場合は、同じボートにいなければならない場合があります。

もちろん、自分のメモリ使用量を最小限に抑えるようにしてください。しかし、過度のメモリ断片化を避けてください。時には問題は、記憶がないということではない。十分な大きさのブロックはありません。場合によっては、Mutableを使用し、新しい不変オブジェクトを生成するのではなく、Mutableを修正することをお勧めします。これは実際に大きなメモリを駄目にする大きなNSStringの場合に特に当てはまります。

UIImage +imageNamed:は、イメージをリリースした後もそのイメージを保持することに注意してください。不要になった場合は、それらを消去する必要があります。キャッシングを止めるには、その名前を解放する前にその名前をnilに設定します。

アプリをInstrumentsで実行していることを確認してください。あなたはあなたが思っているよりも多くの記憶を食べているかもしれません。

自動解放プールを忘れないでください。 1回のイベントループで多数の自動解放オブジェクトを生成する場合は、プールを定期的に排水して、メモリを急増させないようにする必要があります。メモリが急増すると、メモリの要求が緩やかなプログラムが突然破棄される可能性があります。

+0

ありがとうRob。私はそのショットを与えるでしょう。 – K2Digital

+0

「楽器の下であなたのアプリを動かす」と言うとき、最も興味深い尺度は「ライブバイト」ですか? –

+0

私は、一般に、寿命としてCreated&Still Livingという割り当てを使用しています(これがデフォルトです)。私はトラック表示( "i")スタイルを "配置密度"に切り替えるのも特に好きです。これは、基本的に、使用されたバイト数の1次導関数を提供します。これにより、突然メモリを大量に割り当てている場所を簡単に見つけることができます。 –

0

PNGを使用するのではなく、圧縮PVRTCを使用して、スペースを節約する可能性があります(パフォーマンスが低下する可能性があります)。ここでちょっといいチュートリアルあります

http://iphonedevelopment.blogspot.com/2008/12/preparations-for-porting-nehe-lesson-06.html

そして、心に留めておくが、あなたはあなたのOpenGLのいくつかを書き換える必要があるでしょう、この異なる圧縮テクスチャを処理するために呼び出されます。

[免責事項:私はOpenGL ES最適化の専門家ではありません。 looooongショットではありません。]