5

私は大きな問題を抱えており、その理由がよくわかりません。これはケースです:

  • Cocos2D で 10 シーンの素晴らしいプロジェクトを作成します。各シーンは、巨大なスプライトを含む本の 1 ページです。Kobold2D 1.0.2 実装を使用します。
  • すべてのページには、シングルトン クラスに共通のオブジェクトがあり、LayerColor を介して共通のメニューを配置します。
  • スプライトは、PVR.CCZ RGBA4444 の TexturePacker であり、iPad メモリでは、読み込まれたスプライトシートごとに約 16 ~ 20Mb です。
  • 次から次への replaceScene には CCTransitionTurnPage を使用します。
  • 各ページ(クラス)のinitメソッドで、テクスチャとFrameFileを読み込みます。
  • 各ページ(クラス)の onExit メソッドで、テクスチャとframeFileをアンロードします。私は dumpCachedTextureInfo を使用し、テクスチャがメモリから完全にロードおよびアンロードされると言います。
  • もちろん、子からすべてのオブジェクトを削除します。すべてのスプライトは、クラスのすべてのメソッドでアクセスする必要があるため、.h のインターフェイス セクションで宣言された共通変数です。
  • 私のプロジェクトは、ARC プロジェクトに Kobold2D を統合して作成されています (ただし、添付の Kobold2D プロジェクトでは、互換性の問題のために ARC が有効になっていません)。

実際、プロジェクトを開始すると、すべてが完璧に見えますが、作成したシーン (ページ) ごとにメモリが増加しています。Page1: 30Mb.、Page2: 40、Page 3: 54、Page 4: 65... 7 つまたは 8 つのシーンの後、Instruments、Xcode、または iPad 自体がメッセージなしでアプリケーションをハングさせます (最終的にメモリ不足の警告が表示された Instruments を除く)。 .

各シーンの後にメモリが解放されないのはなぜですか? おそらく、ARC と no super dealloc 変数が原因です。テクスチャが完全にアンロードされているように見えるのに、クラッシュするまでメモリが制御なしで増加しているため、アンロードされていないように見えるのはなぜですか?

4

2 に答える 2

10

私は記憶保持に関して同様の問題を抱えていましたが、機器にリークは見られませんでした。すべてのシーンの .m ファイルに以下を書き込むまで、-(void) dealloc を呼び出すことさえできませんでした。

-(void) onExit {
    //unschedule selectors to get dealloc to fire off
    [self unscheduleAllSelectors];
    //remove all textures to free up additional memory. Textures get retained even if the sprite gets released and it doesn't show as a leak. This was my big memory saver
    [[CCTextureCache sharedTextureCache] removeAllTextures];
    [super onExit];
}

これを実装した後、replaceScene: が呼び出されるたびにメモリが解放されました。これがあなたに役立つことを願っています。

于 2012-03-05T19:08:54.017 に答える