2010-12-20 9 views
7

Mam kontroler widoku oparty na Nawigacja iw kontroler widoku ukryłem górny pasek nawigacji i używać niestandardowy UIView jako pasek nawigacji.UIViewController & UIview dealloc nie jest wywoływana

Pasek UIView ma przycisk Wstecz i używam metod Delegata (zadeklarowałem protokół) do komunikacji z kontrolerem widoku po naciśnięciu przycisku Wstecz.

Używam delegata w moim CustomNavigation Bar id delegata;

i w widoku głównym kontrolerem kiedy przeznaczyć pasek nawigacyjny ustawić delegata

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)]; 
topBar.lblTitle.text = @"Shop"; 
topBar.delegate = self; 

zwalniam to bar w dealloc ViewControllers.

Teraz po naciśnięciu przycisku wstecz używam metody delegate, aby wywołać popViewController w głównym ViewController.

//in Custom Bar 
-(void)ButtonPressed { 
    [delegate TopNavigationBarBackButtonPressed]; 
} 

//In View COntroller 
-(void)TopNavigationBarBackButtonPressed { 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

Teraz ViewController jest poped i sterowanie przechodzi do poprzedniego viewController ale dealloc nie jest zwolniony zarówno w ViewController i UIView

Co robię źle?

+0

żadnych ludzi pomysł ?? Dealloc nie zostanie wywołany, jeśli wartość retainCount nie wynosi 0. Ale nie zachowuję nigdzie elementu viewController. Robię [wydanie VwController] po tym, jak pchnę je na stos. Więc jedyny powód, dla którego mogę myśleć, to niestandardowy protokół, który napisałem. Czy muszę to wydać? Zachowuję delegata w nieruchomości. Ale nawet jeśli zwolnię to w dealloc, nie zostanie on wywołany. STUMPED !!! –

Odpowiedz

16

OK! W końcu zrozumiał, o co chodzi.

Tak, to był delegat. Tak więc w moim "wciśniętym przycisku" należy ustawić delegata na NIL.

-(void)TopNavigationBarBackButtonPressed { 

topBar.delegate = nil; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

I voila, wszyscy deallocy zostają wezwani. Przeklęty protokół niestandardowy. 2 dni mojego życia nigdy nie wrócę.

EDYTOWANIE: OK, nie trzeba ustawiać delegata na zero.

Miałem wszystkie problemy, ponieważ w posiadłości zatrzymałem delegata.

@property(nonatomic, retain)id <ASNavigationDelegate>delegate; 

ten powinien być

@property(assign)id <ASNavigationDelegate> delegate; 
+1

Miałem garść widoków, które nie były wypuszczane z tego powodu, jeden zły kawałek kodu, który napisałem, skopiowałem wiele razy - dziękuję za to! – Slee

+0

nadpisywanie zachowania/zwalniania i przeglądanie stosu wywołań może również być pomocne w takich sytuacjach. – markshiz

Powiązane problemy