CCScene の GameScene サブクラスの静的インスタンスを使用しています。GameScene からの呼び出し
[[CCDirector sharedDirector] replaceScene:[MainMenuScene scene]];
GameScene の dealloc メソッドをトリガーしません。
シーンを再度ロードすると (そして新しい GameScene が作成されます)、このメソッドが呼び出されます。
+(id) sceneWithId:(int)sceneId
{
CCScene* scene = [CCScene node];
GameScene* gameScene = [[self alloc] initWithId:sceneId];
[scene addChild:gameScene z:0 tag:GameSceneLayerTagGame];
return scene;
}
-(id) initWithId:(int)sceneId
{
CCLOG(@"scene With id");
if ((self = [super init]))
{
instanceOfGameScene = self;
//ONLY NOW the previous object becomes unreferenced and the memory management system is allowed to deallocate it
メモリが「解放」されたときだけでなく、(静的) シーンを置き換えるたびに dealloc メソッドを強制的に呼び出す方法があるかどうかを理解したいと思いました。
または、代わりに、MainMenuScene に影響を与えたくない進行中のプロセスを停止するいくつかのクリーンアップ メソッドを作成する必要があります (たとえば、GameScene の dealloc メソッドにバックグラウンド ミュージックの停止メソッド呼び出しを配置しましたが、バックグラウンド ミュージックも静的クラスであり、子として GameScene に追加されていない場合、MainMenuScene に戻って再生を続けます)。
したがって、私の簡単な修正提案は、次のようなことです。
[self stopAllStuffInOtherStaticClassesThatAreRelatedOnlyToGameScene];
[[CCDirector sharedDirector] replaceScene:[MainMenuScene scene]];
これは良いアプローチですか?
編集: dealloc メソッドにこのコードを追加するのが賢明なのはいつですか?
[self removeAllChildrenWithCleanup:TRUE];