2009-07-17 16 views
2

アップルのサンプルアプリケーションと私が取り組んでいるゲームで同様の動作が見られました。ゲームでは、メモリ不足によりアプリケーションがクラッシュすることがあります。サンプルアプリケーションはTouchesです。iPhone:タッチを使用しているアプリケーションのメモリ使用量が徐々に増加しています

タッチ中のオブジェクトのいずれかを移動しているときや、ゲーム内で接触がほとんどなくなったときなど、タッチが追跡されているときはいつでも、メモリの使用量は長時間タッチを動かし続けるとタッチシーケンスが完了すると、メモリ使用量は元に戻りません。私はTouchesを手に入れました.Touchesは半分以下のメガを使い始まり、約4MBの正味割り当てまで数分間かけて遊んでいます。そのメモリは決して割り当て解除されません。

私の質問です:なぜこのメモリは決して割り当て解除されませんか?根本的に何かを誤解していますか?これはフレームワークの欠陥ですか?私は、加速度計の問題とタッチの漏れに関するいくつかを読んだが、私はこのゲームでは加速度計を全く使用していない。

答えて

5

私は、

あなたがYESに設定されているNSZombiesEnabledチャンスがありません...これはあまりにも基本的と思われる場合は謝るが、あなたのですか?

これはオブジェクトの割り当てを一切なくし、新しいものを割り当てた場合は、アプリがメモリ不足になることを意味します。

+0

これはまさに私がその環境変数を残しておいたのを忘れたときに起こったことです。これらの自動リリースされたすべてのタッチオブジェクトに対して、メモリは蓄積され続けました。 –

+0

これはその大部分を占めているようです。私はゾンビをオフにし、メモリ使用量が改善されました。しかし、メモリ使用量は依然として増加しています。私はTouchesと対戦した試合を再考すると、Touchesがゾンビを持っていないようで、着実に増加しているフットプリントを示していたようだが、タッチコードのCFSetオブジェクトを保持していなかった。今では私のコードはCFSetオブジェクトに関して同じように動作していますが(たまにいくつかのものがあります)、時間の経過とともにフットプリントが増えています。 –

+0

omfg、これは私に6ヶ月以上問題を引き起こしています!ありがとうございました!さて、私は最終的に悲鳴を上げることなく夜を過ごすことができます... – ngb

0

機器を使用して、どのインスタンスが割り当て解除されていないかを調べます。私は同様の問題を抱えていましたが、それは私がretainと呼んでいたのですが、(ロジックエラーのために)リリースしないということでした。

+0

最近私はインストゥルメンタルで多くの時間を過ごしています。つまり、割り当てを解除されないメモリは、ライブラリ呼び出しの中で割り当てられ使用されるものです。イベント処理インフラストラクチャで使用されているCFSetsや、stringWithFormat:呼び出しの周りに横たわっているように見えるNSStringオブジェクトなどがあります。イベント処理システムがCFSetオブジェクトの割り当てを解除しないなどの問題を解決するにはどうすればよいですか?私はそれらにアクセスすることは決してありません。 –

+0

これらのオブジェクトをまったく保持していますか? – Codebeef

+0

タッチ・イベント・オブジェクト、またはすべてのオブジェクトをタッチ・ハンドラに保持していますか? – Codebeef

0

非常によく似た状況です。実際には、私はちょうど何かに触れることなくアプリを走らせるならば(ディスプレイを更新するためにNSTimerを実行するだけです)。そして私は、メモリが徐々にしかし着実に増加していることに気付きます。

メモリリークがある場合、それは明らかではありません。なぜなら、iveはメモリリークを検出するたびにメモリリークをポップアップするからです。

これは、メモリリークが検出されないことを意味しますか?

+0

はい。 「リーク」は、もはや参照されていないオブジェクトだけではないことに留意してください。無制限のキャッシュを使用している場合、時間の経過と共にメモリ使用量が増加する可能性があります。 – bbum

+0

ヒントのためにありがとう(無制限のキャッシュ...それを見てください!)。 –

+0

bbum、nope。私は "無制限のキャッシュ"を見回すと何も得られません。これを説明していただけますか?キャッシングのルールは何ですか?私は常に正しくキャッシュしていなければなりませんか?質問は、私のキャッシュはどこにあり、どのようにバインド/リリースするのですか? [UIImage imageNamed]を介して読み込まれた画像が画像をキャッシュすることはわかっています。しかし、私はいつもそれらを読み込んでいない、特にアプリケーションがちょうどそこに黙って座っているときではありません。その場合、そのすべてが画像のdrawAtPointメソッドを呼び出すことです。 –

関連する問題