2011-08-13 14 views
4

私は大きな画像を子として追加するGameSceneを持っています。私はすべてのレベルのGameSceneを再作成したい。しかし、いくつかのレベルのゲームが終わると、メモリ警告を受信し、最終的にはクラッシュする。 deallocメソッドは決して呼び出されません。cocos2dシーンのdeallocがreplaceSceneの後で呼び出されない

MainSceneでスタート、ヒット 'スタート' ボタン - >

[[CCDirector sharedDirector] replaceScene: [GameScene scene]]; 

明確な、レベル>

[[CCDirector sharedDirector] replaceScene: [WinScene scene]]; 

ボタン - > '次へ'

[[CCDirector sharedDirector] replaceScene: [GameScene scene]]; 
を打ったとき

など... しかし、GameSceneのdeallocは決して起動されません。 (私はいけない、それが私のための一般的なアプローチであることから、それはGameSceneを保持instanceOfGameSceneだと思う:私は

static GameScene* instanceOfGameScene; 

他の関連するメソッドを持ってGameSceneため

(MainSceneとWinSceneは大丈夫です) 。プログラムは、信号を受信して​​5秒後に、GameSceneのdeallocメソッドが最終的に、解雇されています、私の他のプロジェクトでOK)WinSceneで

-(id) init { 
if ((self = [super init])) { 

    instanceOfGameScene = self; 
etc... 


-(void) dealloc { 
    CCLOG(@"game scene get dealloc'ed"); 
    instanceOfGameScene = nil; 
    [super dealloc]; 
} 



+(GameScene*) sharedScene 
{ 
    return instanceOfGameScene; 
} 

、私は[YES [GameScene sharedScene] removeAllChildrenWithCleanup]:実行するのです」 EXC_BAD_ACCESS "。最後の行に - (無効)removeAllChildrenWithCleanup:CCNodeクラスで(BOOL)クリーンアップ方法:その後、

ccArrayRemoveAllObjects(data); 

です:

[children_ removeAllObjects]; 

スタックより深いエラーCCArray removeAllObjectsがある

/** Removes all objects from arr */ 
static inline void ccArrayRemoveAllObjects(ccArray *arr) 
{ 
    while(arr->num > 0) 
     [arr->arr[--arr->num] release]; 
} 

答えて

2

問題を解決しました。私はボタンを(GameSceneのいくつかのオブジェクトを保持するかもしれないブロック宣言で)onEnterメソッドに入れ、initメソッドの中にすべてのものを入れるのではなく、onExitメソッドでそれを削除します。それは奇妙に聞こえるかもしれませんが、今はうまくいきます。 ^ _^1日のデバッグ後にはうれしいです。

0

GameSceneがシングルトンになる理由はありません。確かに作成されたシングルトンではありません。ほとんどの場合、[super dealloc]が呼び出される前に自分自身を設定解除してしまった、あまり作成されていないシングルトンではありません。確かに、よく使われていないシンプトンが作成されているわけではありません。シングルトンの目的は、クラスそのものの寿命ではなく、アプリケーションの過程で一度初期化されるクラスを持つことです。

シングルトンを修正して通常のクラスにしても問題は解決しない場合、問題はコードに表示されていません。

また、GameSceneを無効にした後、CCTextureCacheを押して未使用のテクスチャを解放することもできます。それは記憶の面であなたを助けます。

+0

これは絶対に共通です!シングルトンを使用することの大きな利点は、GameSceneを共有できるためです。 (ユニットテストの能力は失われますが) – OMGPOP

+0

CCSceneを正しくプログラミングしていれば、CCSceneを共有する理由はありません。シングルトンアプローチを必要とするCCSceneを共有する必要があるいくつかの例は何ですか? –