2011-07-11 13 views
6

Mam UIViewController (nazwij to NumberTwo), który przedstawiłem jako kontroler widoku modalnego z innego kontrolera UIViewController (nazwij go NumberOne). NumberTwo zawiera metodę touchesBegan, która nasłuchuje dotyku, a także ma metodę przyspieszeniomierza, która nasłuchuje zmian orientacji urządzenia w kierunku x, y lub z. NUMBERTWO posiada przycisk o nazwie „Gotowe”, który po podsłuchu, odrzuca się jako modalne kontrolera widoku:Aplikacja na iPhone - odwołanie modalnego kontrolera widoku nie dealloc to

[self dismissModalViewControllerAnimated:NO]; 

Ale wydaje się, że to wciąż nasłuchując akcentami, a to wciąż nasłuchując przyspieszeń. Jak mogę całkowicie zwolnić NumberTwo, kiedy go odrzucam? Próbowałem dodać komunikat o zwolnieniu w następujący sposób:

[self dismissModalViewControllerAnimated:NO]; 
[self release]; 

ale to spowodowało EXEC_BAD_ACCESS.

Odpowiedz

3

Czy zwolniłeś kontroler po jego przedstawieniu? Na przykład. w metodzie in NumberOneController który przedstawia go, czy masz coś takiego:

NumberTwoController * controller = [NumberTwoController alloc] init]; 
// do stuff to config controller 
[self presentModalViewController: controller]; 
[controller release]; 

Chyba że chcesz powiesić na NumberTwoController do ponownego użycia, będzie to zwykły wzór. Metoda presentModalViewController zapewnia, że ​​kontroler jest zachowywany, gdy jest używany. Powinien następnie zostać uporządkowany, gdy w ramach NumberTwoController zadzwonisz pod numer [self dismissModalViewControllerAnimated: NO].

+0

Co zrobić, jeśli używasz ARC? W jaki sposób zniszczyć viewController po zwolnieniu? – tybro0103

+0

Jeśli używasz ARC, wówczas kompilator (w efekcie) wstawi [wydanie kontrolera] po tym, jak kontroler zostanie zaprezentowany modalnie. Nie trzeba podejmować żadnych kroków w sprawie zwolnienia - system iOS upewni się, że kontroler zostanie zwolniony w takich okolicznościach. – Obliquely

1

Upewnij się, że wypuszczasz wszystko, czego używasz, gdy skończysz; Metoda dealloc jest wywoływana tylko wtedy, gdy UIViewController i wszystkie jej właściwości/obiekty nie są już używane. Nigdy nie używaj [self release];, musisz zwolnić go z kontrolera widoku, który go utworzył, gdy skończysz.

3

Miałem bardzo podobny problem, który dręczył mnie od wielu dni. Okazało się, że moja klasa kontrolera widoku nie została zwolniona, gdy ją odrzuciłem, ponieważ kontroler widoku miał aktywny NSTimer, który nie został unieważniony (zatrzymany). Byłem w stanie zabić timer w viewDidDisappear.

+1

Jak się dowiedziałeś? Chodzi mi o to, czy jest coś w Instrumentach, które pomaga w tej sytuacji, czy też po prostu ponownie czytasz swój kod? – Pierre

+0

Przepraszamy za opóźnienie w odpowiedzi - niestety po prostu ponownie przeczytałem mój kod, który go rozwiązał. – TPoschel

Powiązane problemy