3

iPhone向けのゲームを制作中です。開発が完了し、ゲームをメモリ用に最適化しようとしています。ゲームで特定の MVC をロードして閉じると、割り当てられたメモリのすべてが解放されるわけではないことに気付きました (~ 4-5MB が追加されます)。これにより、15 ~ 20 分間プレイし続けると、ゲームのメモリ使用量が非常に高くなり、メモリ不足の警告が表示された後にゲームが最終的にクラッシュします。

1. ゲームで静的アナライザーを
実行し、すべてのメモリ リークと警告を修正しました。
2. すべてのクラスの dealloc が呼び出されているかどうかを手動で確認しました。これでよさそうです。
3. また、Xcode で Allocations ツールを実行しようとしましたが、そのエントリのほとんどは CFStrings、mallocs、CFNumbers などですが、どのクラスから発信されたものかわかりません。割り当てツールを使用するより良い方法はありますか?

メモリ関連の質問もいくつかあります
。 1. 自動解放プールを使用せずに、ゲーム内の多くの場所で自動解放オブジェクトを使用しています。私の理解では、自動解放されたオブジェクトは次の実行ループで解放されるべきであり、そのような大きな問題を引き起こすべきではありませんか?
2. また、xib ファイルを介して画像をロードすると、iOS によってキャッシュされます。彼らもメモリをむさぼり食うのだろうか?

メモリ使用量の問題を解決するにはどうすればよいですか。どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

4

いくつかの考え:

  1. Core Foundationクラスを使用していますか?Core Foundationが呼び出すすべてのオブジェクトについて、呼び出す名前で、CreateまたはCopy呼び出す名前で(またはCFRelease、所有権を譲渡してから、Objective-Cオブジェクトに)変更するようにしてください。releaseautorelease

  2. Instrumentsのリークツールも使用しましたか?私はそう思いますが、あなたはそれについて言及しませんでした。Instrumentsユーザーガイドのアプリでのリークの検出を参照してください。

  3. 経由で画像を読み込んでいますimageNamedか?それは画像をキャッシュし、それらを解放するのは良くありません。imageWithContentsOfFileキャッシュを手動で使用および管理する方が安全です。

  4. ビューコントローラdeallocが呼び出され、クラスプロパティ/ ivarsに関連付けられているすべてのオブジェクトを解放していると思いますか?

  5. ゾンビをオンにしましたか?これは診断目的には最適ですが、ゾンビをオフにするまでメモリを解放しません。

于 2013-01-21T20:30:00.127 に答える
2

何かを「作成中」の場合は、ARC(自動参照カウント)を使用する必要があります。すべてARCに変換されると、これらの自動解放オブジェクトは不要になり、コンパイラーは適切なタイミングでオブジェクトを解放します。オブジェクトのプールがまだ制御不能になっている状況がある場合は、@autoreleasepool宣言型を使用して独自の自動解放プールを作成できます。

ARCに切り替えることで、さらに簡単に開発できるようになると思います。ARCに変換した後、Instrumentsでアプリのプロファイルを再度作成し、オブジェクトの大きなプールを作成している問題のあるコードを絞り込みます。

あなたの説明に基づいて、ARCに変換しないことを選択した場合、あなたが参照しているビューで保持サイクルを持つことができるように思われます。ビューが保持されているすべての場所をトレースして、ビューが実際に解放されていることを確認します。

于 2013-01-21T20:28:33.967 に答える
2

Rob と Chris が言ったことを次に実行します。

アクティブな割り当てのみを追跡し、参照カウントを記録するように構成された割り当てインストゥルメントを使用します。

Allocations がデータを収集している間、アプリを少し使用してから、アプリケーションを一時停止します。

一時停止中は、Live Bytes と # Living による並べ替えが最も便利なビューです。Foundation コレクション クラスを利用するデータ中心のアプリケーションの場合、*String、*Dictionary、および *Array の組み合わせが最も一般的である可能性があります。

それは大丈夫です。これらのいずれかの詳細をクリックすると、現在メモリ内にあるすべてのインスタンスの長いリストが表示されます。po <addr>それらのいずれかを見て、それらが何であるかを確認できます。また、リストをスクロールして、どの関数が最も一般的に割り当てを担当しているかを確認することもできます. 同様に、任意のインスタンスをクリックして、割り当てられた場所や、まだ残っている理由を確認できます。

同様に、概要テーブルから始めて、#Living で並べ替え、クラスの 1 つの最初のインスタンスまで下にスクロールすることもできます。そのクラスが大量のデータを保持している場合、それを排除または最適化することは素晴らしいスタートです。

そしてもちろん、メモリの成長を世代別に分析するための非常に効果的なツールとして、ヒープショット分析を忘れないでください。

于 2013-01-21T22:25:18.883 に答える