2011-03-08 18 views
5

Por alguna razón, el desalojo de mi CCLayer no se dispara al reemplazar la escena. Aquí está el código para reemplazar la escena:dealloc no se activó al reemplazar escenas en Cocos2d

[[CCDirector sharedDirector] replaceScene:[CCFadeTransition transitionWithDuration:2.0f scene:[HelloWorld scene]]]; 

El código anterior se activa cuando se presiona un botón.

He colocado un NSLog dentro del método dealloc que nunca se desencadena.

ACTUALIZACIÓN 1:

que terminó la solución del problema al liberar manualmente la memoria justo antes de cambiar la escena.

+0

Suena que la escena que fue sustituido por escena HelloWorld no fue puesto en libertad. ¿Cómo se crea una instancia de la escena y cómo tiene su instancia CCLayer? –

+0

significa que algo está reteniendo la capa. – xuanweng

+0

¿Pasó alguna referencia de la capa actual a algún otro objeto? algo así como Layer = currentLayer? –

Respuesta

6

La primera vez que comencé a usar cocos2d me encontré con exactamente el mismo problema. En mi caso, me agregan como delegado específico el yo y eso significa que la cuenta de referencia para el yo se incrementó.

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:2]swallowsTouches:NO];

Y he resuelto mediante la eliminación de todos los delegados (también se puede especificar en particular delegado):

[[CCTouchDispatcher sharedDispatcher] removeAllDelegates];

0

Según this post at cocos2d-iphone forum, sólo tiene que llamar self.isTouchEnabled = YES; en el método init a permite que Cocos2D llame automáticamente al método removeDelegate: en el CCTouchDispatcher. Básicamente el siguiente código debería ser suficiente:

- (void)init { 
    // do the usual [super init] stuff 


    self.isTouchEnabled = YES; // don't forget the self prefix! 

    return self; 
} 

- (void)registerWithTouchDispatcher { 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:2 swallowsTouches:NO]; 
} 

No hay necesidad de onEnteronExit y como deberían ser manejados automáticamente si utiliza self.isTouchEnabled = YES;

+0

¿Qué pasa con la votación baja? ¿No respondí la pregunta? – Lukman

+0

Es posible que esté respondiendo una parte de la pregunta, pero no está aclarando por qué. Me parece que la cuestión es gestionar la memoria de la escena, y no estoy 100% seguro, pero parece que estás diciendo que la escena se está sumando a sí misma como un delegado táctil. Por lo tanto, el despachador táctil lo está reteniendo. Me encuentro con el mismo problema que @azamsharp, y tengo más curiosidad sobre por qué el ajuste manual de "isTouchEnabled" hará que la escena se lance correctamente. – goatlinks

Cuestiones relacionadas