2013-12-18 13 views
5

Mam menu główne, które uruchamia kontroler widoku z SKView/SKScene za pośrednictwem modalnego segue. Potem nazywam dismissViewControllerAnimated, która zwraca aplikację do głównego menu, ale wciąż słyszę efekty dźwiękowe z SKScene. Kiedy wielokrotnie uruchamiam SKScene, aplikacja ostatecznie się zawiesza.Scena SpriteKit nie jest dostępna

Próbowałem wykonać samouczek analizy heapshotu (http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/), ale wydaje się, że nigdzie się nie dostaję. Upewniłem się, że zwalniam wszystkie silne @ właściwości ...

Wszelkie pomysły na temat tego, co może być przyczyną tego problemu? Czy jakikolwiek kod/zrzuty ekranu będą pomocne, czy mogę podać jakieś informacje, które pomogą zawęzić problem?

Instruments

+2

Włączono ARC? Sprawdź wszystkie silne instancje, czy przechowujesz którekolwiek z nich poza instancjami kontrolera widoku skview/skscene lub sk? Innym częstym błędem jest cykl zatrzymania wspólny dla struktur wykresów, na przykład, gdy jeden węzeł zachowuje silne odniesienie do jednego z jego węzłów macierzystych lub rodzeństwa (sprawiają, że są słabe). – LearnCocos2D

+0

Tak, używając ARC. Re. twoje drugie pytanie, każda klasa, która ma silne instancje ustawia je na zero w obu viewDidUnload lub dealloc, czy to nie wystarczy? Zajrzę do kodu, aby zbadać twój ostatni punkt. –

+0

Niestety naprawienie wszystkich cykli zatrzymania, które mogłem znaleźć, nie pomogło ... –

Odpowiedz

0

można zaimplementować dismissViewControllerAnimated metoda połączenia w następujący sposób.

[self dismissViewControllerAnimated:NO completion:^{ 
    // release the SKScene here.... 
}]; 
+0

Nie używam kontrolera nawigacyjnego, tylko modalne segues i UIViewControllers –

+0

OK, w takim przypadku można jeszcze zaimplementować metodę dismissViewControllerAnimate: completion block i zwolnić obiekty w bloku. – ldindu

+0

Dlaczego jest to konieczne, gdy kod zwolnienia znajduje się w viewDidUnload? –

4

Na podstawie przedstawionych informacji trudno jest się dowiedzieć. Mogę powiedzieć, że miałem podobny problem i okazało się, że jest on powiązany z obiektami SKAction. Cacheowałem Akcje jako właściwości sceny, a następnie uruchamianie tych czynności przez węzły podrzędne. Stwierdziłem, że zapewnienie, że węzły podrzędne o nazwie removeAllActions wyeliminowały problem dla mnie. Coś w rodzaju:

-(void) willMoveFromView:(SKView *)view 
{ 
    [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     SKNode* child = obj; 
     [child removeAllActions]; 
    }]; 

    [self removeAllChildren]; 
} 

Nie jestem pewien, czy to jest to, z czym masz do czynienia, ale może być czymś, na co warto zwrócić uwagę.

Powiązane problemy