2011-01-12 5 views
2

UITableView를 표시하는 내 응용 프로그램에서보기가 있습니다. 이 뷰는 nib 파일에서 생성되며 사용자 정의 뷰 컨트롤러가 있습니다. 이 뷰에 대한 UIViewController 하위 클래스는 UITableView의 Datasource 및 Delegate 역할을합니다.UIViewController -dealloc 모달보기 컨트롤러를 닫은 후 호출되는 경우

내 UITableView는 내 데이터를 기반으로 여러 행을 표시합니다. 그런 다음 마지막 행에 다른 텍스트 "추가 ..."가 표시됩니다. 마지막 행을 선택하면 사용자가 더 많은 데이터를 추가 할 수 있도록 모달보기 컨트롤러가 표시됩니다. 모달보기 컨트롤러를 닫을 때 원래 뷰 (예상대로)가 다시 표시되고 모두 잘 나타납니다. 그러나이보기와 상호 작용하려고하면 응용 프로그램이 충돌합니다.

UIViewController (UITableView의 경우)를 통해 여러 NSLog() 문을 배치하는 것으로부터 모달 뷰가 해제 된 직후에 -dealloc 메서드가 호출되는 것으로 확인되었습니다. 이것은 그 견해로 무언가를하려고 할 때 충돌을 설명합니다. 그러나, 왜이 -dealloc이 뷰 컨트롤러에서 호출되는지 알 수 없습니다.

모달 뷰 컨트롤러를 닫으려면, 내가 가진 : 모달 뷰 컨트롤러의 UIViewController에 IBAction를 방법의 코드로

[self dismissModalViewController:YES]; 

. 이 작업은 해당 nib 파일의 취소 버튼에 연결됩니다.

또한, View Controller Programming Guide에서 내 이해는 모달 컨트롤러를 자체에서 제거하는 것이 좋지만 대리자를 사용하는 것이 더 강력합니다. 처음에는 델리게이트를 사용했지만 디버깅을 단순화하기 위해 델리게이트를 가져갔습니다. 방금 대리인을 다시 확인하기 위해 넣었고 대리인을 사용할 때도 동일한 문제가 발생합니다.

[[self delegate] myModalViewController:self didAddObject:obj]; 

부모 뷰 컨트롤러의 위임 구현은 다음과 같습니다 :로 모달 컨트롤러의 액션 메소드는 구현 호출

[self dismissModalViewController:YES] 

사람이 전에 본 경우 또는이 발생 될 수있는 어떤 제안이나 이것을 디버깅하는 방법을 알려 주시면 감사하겠습니다.

+0

부모보기 컨트롤러가 할당 취소 된 컨트롤러라는 의미입니까? – BoltClock

+0

네, 맞습니다. – jmac

답변

6

-dealloc이 호출되면 뭔가가보기 컨트롤러를 해제합니다. 뷰 컨트롤러에 -release을 구현하는 시도 :이 예기치 않은 해제 메시지가 발생하면 호출 스택을 검사 할 디버거를 사용할 수 있습니다

-(void)release { 
    NSLog(@"view controller released"); 
    [super release]; 
} 

있도록.

+1

정말 고마워요! 모달보기 컨트롤러의 dealloc 메서드에서 [delegate release]를 호출했습니다. 선을 베푸려고하고 나 자신을 깨끗하게하려고합니다. 실제로 부모 뷰 컨트롤러를 해제한다는 사실에 대해서는 생각하지 않았습니다. 나는 당신의 제안없이 이것을 발견하지 못했을 것이다. 고맙습니다! – jmac

+2

ARC 용 릴리즈 대신 사용할 수있는 것은 무엇입니까? – yatanadam

3

모달보기 컨트롤러 자체에서 dismissModalViewController (메시지는 부모보기 컨트롤러로 전달됩니다)으로 전화하는 것은 위험합니다. 다른 곳에서 유지하지 않은 경우 위험합니다. 일반적으로 부모 뷰 컨트롤러는 제시된 모달 뷰 컨트롤러를 닫을 책임이 있습니다.

+0

이 문제를 해결하기 위해 원본 게시물을 업데이트했습니다. – jmac

+0

이것은 매우 중요하고 알아 내기가 어렵습니다! – eliocs

관련 문제