2010-12-20 1 views
7

탐색 기반의보기 컨트롤러가 있고보기 컨트롤러에서 위쪽 탐색 모음을 숨기고 사용자 지정 UIView를 탐색 모음으로 사용했습니다.UIViewController 및 UIview dealloc이 호출되지 않습니다.

UIView 막대에는 뒤로 단추가 있으며 뒤로 단추가있는 경우보기 컨트롤러와 통신하기 위해 대리자 메서드 (프로토콜 선언)를 사용합니다.

내 CustomNavigation Bar에 위임자를 사용합니다. id delegate;

메인 뷰 컨트롤러에서

은 내가 탐색 모음 내가 내가 ViewControllers의 할당 해제에서이 줄을 해제 위임

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

을 설정 할당 할 때.

이제 뒤로 버튼을 누르면 위임 메소드를 사용하여 주 ViewController에서 popViewController를 호출합니다.

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

//In View COntroller 
-(void)TopNavigationBarBackButtonPressed { 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

는 지금의 ViewController는 poped되고 제어는 이전의 ViewController로 이동하지만, 할당 해제 내가 잘못하고있는 중이 야 무엇의 ViewController와 UIView의

모두에서 해고되지 않는 이유는 무엇입니까?

+0

어떤 생각 사람이어야한다? retainCount가 0이 아닌 경우 dealloc이 호출되지 않습니다. 그러나 어디서나 viewController를 유지하지 않습니다. 스택에 푸시 한 후 [vewController release]를 수행합니다. 그래서 제가 생각할 수있는 유일한 이유는 제가 작성한 맞춤 프로토콜입니다. 나는 그것을 풀어야합니까? 나는 재산에서 대리인을 보유합니다. 하지만 dealloc에서 해제한다고해도 호출되지 않습니다. 멈췄다 !!! –

답변

16

OK! 마지막으로 문제가 무엇인지 이해했습니다.

예 위임자입니다. 그래서 내 "뒤로 버튼을 누르면"메서드에서 NIL 대리자를 설정해야합니다.

-(void)TopNavigationBarBackButtonPressed { 

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

그리고 모든 dealloc이 호출됩니다. 젠장, 사용자 정의 프로토콜. 내 인생 2 일간 나는 결코 다시는 돌아 오지 않을 것이다.

편집 : OK 위임자를 nil로 설정할 필요가 없습니다.

속성에서 내가 대리인을 보유하고 있었기 때문에 나는 모든 문제를 겪고있었습니다.

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

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

나는 여러 번 복사 한 코드 중 하나의 나쁜 조각 - 이것 때문에 고맙다는 이유로 공개하지 않는 견해를 가지고있었습니다! – Slee

+0

retain/release를 무시하고 호출 스택을 살펴 보는 것도 이러한 상황에 도움이 될 수 있습니다. – markshiz