2013-11-20 19 views
5

Così ho un oggetto CCLayer che ha un oggetto figlio CCSprite, quando una condizione si verifica (rilevata da un metodo di aggiornamento) un metodo della CCSprite è chiamata che si definisce il seguenteObj-c NSNotificationCenter Bad accesso

[[NSNotificationCenter defaultCenter] postNotificationName:@"mymethod" object:nil]; 

il CCLayer passa poi a correre

[node removeFromParentAndCleanup:YES]; 

per il CCSprite per rimuoverlo. Il CCLayer chiamato anche seguendo l'init

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mymethod) name:@"mymethod" object:nil]; 

ora 9 volte su 10 questo va bene e funziona come previsto però a volte ho un bad_access indicando la linea di posta di notifica.

La mia ipotesi di leggere su altre persone che hanno problemi di è che l'oggetto figlio è stato rimosso, ma non so in che altro modo farlo mentre viene chiamato prima che venga rimosso.

Potrebbe accadere qualcosa per ritardare la chiamata alla notifica e sta per essere chiamato dopo che l'oggetto è stato rimosso o sto abbaiando nell'albero sbagliato?

UPDATE

Aggiunto codice di rimozione sopra, se io commento la linea rimozione e la pulizia non accade.

+2

puoi pubblicare il codice in cui rimuovi il bambino? –

+0

potresti voler postare nel metodo onExit, se alla fine la classe genitore è una classe cocos2d. onExit viene richiamato durante il ciclo 'removeFromParent' ed è eseguito prima della rimozione effettiva. Non dimenticarti di [super su uscita]. – YvesLeBorg

+0

Hai provato U o "rimosso" l'oggetto, solo per vedere se succede ancora? – AntonijoDev

risposta

5

È necessario rimuovere l'osservatore. Gli osservatori non vengono rimossi automaticamente, quindi se non li rimuovi li impili in memoria, questo potrebbe essere il motivo per cui si rompe in seguito.

+0

Eccellente grazie, ho aggiunto quanto segue al mio metodo dealloc '[[NSNotificationCenter defaultCenter] removeObserver: self];' Gli darò un test. –

+0

ok spero Funziona – AntonijoDev

+0

Sì, mi sembra buono, non posso più produrre l'errore. Grazie! –