2012-02-23 3 views
0

Я пытаюсь перезагрузить текущую сцену, и произойдет init, затем dealloc.получить текущую сцену возвращается NULL?

Я хочу иметь условие на dealloc, чтобы вернуться назад, если он вызвал из текущей сцены.

я пытался это:

if ([[[CCDirector sharedDirector] runningScene] getChildByTag:16]) 
return; 

и

[[[CCDirector sharedDirector] runningScene] isKindOfClass:[HelloWorldLayer class]] 

и дает мне NULL, и условие не истинно.

Почему?

моя сцена выглядит следующим образом:

+(CCScene *) scene 
{ 
    // 'scene' is an autorelease object. 
    CCScene *gameScene = [CCScene node]; 

    // 'layer' is an autorelease object. 
    HelloWorldLayer *layer = [HelloWorldLayer node]; 

    layer.tag=16; 
    // add layer as a child to scene 
    [gameScene addChild: layer]; 

    // return the scene 
    return gameScene; 
} 

, как я могу устранить dealloc, когда я только обновить сцену ??

+4

не уверен, что я понимаю ваш вопрос полностью, однако: нет никакого способа, чтобы прервать dealloc - это один из способов поездки, это происходит после того, как ваш объект был освобожден. Вам необходимо предотвратить, чтобы ваш объект (ы) был освобожден в первую очередь. – nielsbot

+0

Я не думаю, что это правда. return on dealloc выйдет из этой функции. – Curnelious

+1

Нет, объект будет освобожден. Фактически, когда dealloc называется runtime, вы просто можете освободить объекты, которые вы сохраняете, но он освободит ваш объект, когда dealloc закончит. Поэтому, когда вы вызываете возврат, вы в основном говорите ему: это нормально, вы можете освободить этот объект сейчас. – sch

ответ

1

Никогда не делайте этого:

[[CCDirector sharedDirector] replaceScene:self] 

или это:

CCDirector* director = [CCDirector sharedDirector]; 
[director replaceScene:director.runningScene]; 

Вы не можете заменить текущую сцену, просто передавая себя или работающий в настоящее время сцены методом replaceScene. Вам всегда нужно создать новый экземпляр вашего класса CCScene:

[[CCDirector sharedDirector] replaceScene:[MyScene scene]] 

Будьте осторожны с runningScene. В первый раз, когда вы отправляете сообщение runWithScene директору, runScene всегда будет нулевым. Вы можете отложить некоторую инициализацию метода OnEnter:

-(void) onEnter 
{ 
    // runningscene is valid in onEnter 
    [[CCDirector sharedDirector] runningScene]; 
    [super onEnter]; 
} 
Смежные вопросы