hi, can you advise me on how to properly restart a scene? when i first start the scene, everything is ok but for example i completed the scene and run it again, i get all these leaks:
Leaked Object # Address Size Responsible Library Responsible Frame
Malloc 2.50 KB,1 0x7a13e00 2.50 KB Versus -[CCTextureAtlas resizeCapacity:]
Malloc 16 Bytes,1 0x11cdc950 16 Bytes Versus ccArrayNew
CCArray,1 0x11cb42e0 16 Bytes Versus -[CCSpriteBatchNode initWithTexture:capacity:]
CCArray,1 0x11cd2270 16 Bytes Versus -[CCSpriteBatchNode initWithTexture:capacity:]
Malloc 224 Bytes,1 0x11cb0780 224 Bytes Versus ccArrayNew
Malloc 224 Bytes,1 0x11cd2190 224 Bytes Versus ccArrayNew
CCTMXLayer,1 0x11cb4750 320 Bytes Versus +[CCTMXLayer layerWithTilesetInfo:layerInfo:mapInfo:]
NSMutableDictionary,1 0x11cb08f0 48 Bytes Versus -[CCTMXLayer initWithTilesetInfo:layerInfo:mapInfo:]
Malloc 16 Bytes,1 0x11cae090 16 Bytes Versus ccCArrayNew
CCTMXTilesetInfo,1 0x11cae360 48 Bytes Versus -[CCTMXMapInfo parser:didStartElement:namespaceURI:qualifiedName:attributes:]
Malloc 1.00 KB,1 0xaa17c00 1.00 KB Versus ccCArrayNew
Malloc 1.00 KB,1 0xaa01000 1.00 KB Versus inflateMemoryWithHint
__NSCFString,2 < multiple > 64 Bytes Foundation -[NSPlaceholderString initWithBytes:length:encoding:]
CCSprite,1 0x11cd2590 432 Bytes Versus -[CCTMXLayer appendTileForGID:at:]
CCTextureAtlas,1 0x11cb4330 48 Bytes Versus -[CCSpriteBatchNode initWithTexture:capacity:]
Malloc 16 Bytes,1 0x11cae060 16 Bytes Versus ccArrayNew
i am using a game manager to replace scenes.
-(void) runSceneWithID:(SceneTypes)sceneID {
SceneTypes oldScene = currentScene;
currentScene = sceneID;
id sceneToRun = nil;
switch (sceneID) {
case kIntroScene:
sceneToRun = [IntroScene node];
break;
case kMainMenuScene:
sceneToRun = [MainMenuScene node];
break;
case kLevelSelectScene:
sceneToRun = [LevelSelectScene node];
break;
case kLevelCompleteScene:
sceneToRun = [LevelCompleteScene node];
break;
case kGameLevel1:
curLevel = kGameLevel1;
sceneToRun = [TowerSelectLayer node];
break;
case kGameLevel2:
curLevel = kGameLevel2;
sceneToRun = [TowerSelectLayer node];
break;
case kGameLevel3:
curLevel = kGameLevel3;
sceneToRun = [TowerSelectLayer node];
break;
case kGameLevel4:
curLevel = kGameLevel4;
sceneToRun = [TowerSelectLayer node];
break;
case kGameLevel5:
curLevel = kGameLevel5;
sceneToRun = [TowerSelectLayer node];
break;
default:
CCLOG(@"Unknown ID, cannot switch scenes");
break;
}
if (sceneToRun == nil) {
currentScene = oldScene;
return;
}
if ([[CCDirector sharedDirector] runningScene] == nil) {
[[CCDirector sharedDirector] runWithScene:sceneToRun];
} else {
[[CCDirector sharedDirector] replaceScene:sceneToRun];
}
}
although its a game manager, it actually restarts the same scene every each time. in the maingamelayer i use a switch to determine which level is selected
curGameLevel = [GameManager sharedGameManager].curLevel;
switch (curGameLevel) {
case kGameLevel1:
break;
case kGameLevel2:
break;
case kGameLevel3:
[self schedule:@selector(addEnergyCube) interval:25.0];
break;
case kGameLevel4:
[self schedule:@selector(addEnergyCube) interval:25.0];
break;
case kGameLevel5:
[self schedule:@selector(addEnergyCube) interval:25.0];
break;
default:
break;
}
also in the maingamelayer, i try to clear all the arrays that where used in the run of the scene
-(void) cleanScene {
DataModel *m = [DataModel getModel];
[m._towers removeAllObjects];
[m._towersR0 removeAllObjects];
[m._towersR1 removeAllObjects];
[m._towersR2 removeAllObjects];
[m._towersR3 removeAllObjects];
[m._towersR4 removeAllObjects];
[m._towersR5 removeAllObjects];
[m._towersR6 removeAllObjects];
[m._towersR7 removeAllObjects];
[m._towersR8 removeAllObjects];
[m._towersR9 removeAllObjects];
[m._targets removeAllObjects];
[m._targetsR0 removeAllObjects];
[m._targetsR1 removeAllObjects];
[m._targetsR2 removeAllObjects];
[m._targetsR3 removeAllObjects];
[m._targetsR4 removeAllObjects];
[m._targetsR5 removeAllObjects];
[m._targetsR6 removeAllObjects];
[m._targetsR7 removeAllObjects];
[m._targetsR8 removeAllObjects];
[m._targetsR9 removeAllObjects];
}
i am not sure if this the right way to delete all objects in the arrays.
please help. i don't if its not dealloc correctly or what, i don't know. thank you.