2013-11-20 35 views
5

Mam więc obiekt CCLayer który posiada obiekt CCSprite dziecko, gdy warunek dzieje (wykryty metodą update) sposobu według CCSprite nazywa która sama wywołuje następująceObj-C NSNotificationCenter Bad Dostęp

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

CCLayer następnie przechodzi do uruchomienia

[node removeFromParentAndCleanup:YES]; 

dla CCSprite aby ją usunąć. CCLayer nazywany również na metody init

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

Teraz 9 razy na 10 to jest w porządku i działa zgodnie z oczekiwaniami, jednak od czasu do czasu dostaję bad_access skierowaną do linii zgłoszenie postu.

Domyślam czytając o innych ludzi mających podobneproblemów jest to, że to dlatego, że obiekt dziecko zostało usunięte, ale nie wiem jak inaczej to zrobić, jak jest nazywany, zanim zostanie usunięte.

Czy coś może się zdarzyć, aby opóźnić wywoływanie powiadomienia i kończy się ono wywoływane po usunięciu obiektu, czy też szczerzę złe drzewo?

UPDATE

Dodany kod usunięcie wyżej, jeśli I ustosunkowania się linię usunąć i oczyszczania nie stało.

+2

Czy możesz opublikować kod, w którym usuwasz dziecko? –

+0

możesz chcieć opublikować w metodzie onExit, jeśli klasa nadrzędna ostatecznie jest klasą cocos2d. onExit jest wywoływany podczas cyklu "removeFromParent" i jest wykonywany przed faktycznym usunięciem. Nie zapomnij o [super onExit]. – YvesLeBorg

+0

Czy próbowałeś, czy nie "usunięto" obiektu, aby sprawdzić, czy nadal się dzieje? – AntonijoDev

Odpowiedz

5

Musisz usunąć obserwatora. Obserwatorzy nie są automatycznie usuwani, więc jeśli ich nie usuniesz, umieścisz je w pamięci, co może być przyczyną ich późniejszego zerwania.

+0

Bardzo dziękuję, dodałem do mojej metody dealloc: [[NSNotificationCenter defaultCenter] removeObserver: self]; "Dam test. –

+0

OK hope Działa – AntonijoDev

+0

Tak, wydaje mi się to dobre, nie mogę już produkować tego błędu. Dzięki! –