3

첫 번째 : 내 앱을 ARC로 포팅했는데 모든 것이 작동하는 것처럼 보였습니다. 하지만 이제는 문제가 발견되었습니다 : 스택에 UIViewController를 모달로 표시하는 UINavigationController가 있습니다. 그러나 모달 뷰 컨트롤러를 닫을 때 스택의 뷰 컨트롤러가 할당 취소 된 것처럼 보이지 않습니다. 여기에 내가 할 것입니다 : ARC UINavigationController 스택이 모달 뷰 컨트롤러로 표시 될 때 할당 해제되지 않습니다.

UIViewController* root = [[UIViewController alloc] init]; 
UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:root]; 
[self presentModalViewController:navi animated:TRUE]; 

그런 다음 루트에서 좀 더보기 컨트롤러를 밀어하지만 정말 중요하지 않습니다. 사실 나중에 전화 할 때입니다.

[self dismissModalViewControllerAnimated:TRUE]; 

루트가 할당 해제되지 않습니다. 물론 내 코드 루트에서 UIViewController의 하위 클래스이며 dealloc 및 viewDidUnload를 추적하지만 아무 것도 호출되지 않습니다.

아이디어가 있으십니까?

답변

3

내비게이션 컨트롤러에는 무엇이 있습니까? 다른 것 (네비게이션 컨트롤러 내부의 뷰 컨트롤러)이 네비게이션 컨트롤러가 해제되지 않는다는 의미의 체인을 이끌고있는 범인 일 수 있습니다.

어느 쪽이든 게시 한 코드가 정확하므로 dismissModalViewController을 호출 한 후 내비게이션 컨트롤러가 해제되지 않으면 다른 것에 활성 참조 또는 해당 종속성 중 하나가 여전히 있음을 알 수 있습니다. 나는 그것이 당신의 질문에 대답하지 않는다는 것을 압니다,하지만 당신은 아마도 사냥해야 할 것입니다.

+0

UINavigationController 내부에는 특별한 것이 없으며 표준 클래스입니다. 그리고 위의 UINavigationController 또는 UIViewcontroller에 대한 참조가 없습니다. 너무 많은 불필요한 코드를 게시하고 싶지 않았습니다. 하지만 그 주제에 대한 실험을하고 나중에 내 결과를 게시하려고합니다 ... –

+0

좋아, 좋아, 실제로 ViewController (내게 수치)에 대한 강력한 참조를 발견. 다른 사용자 지정 클래스에 대한 대리자였으며 대리자는 id 대리자로 선언되었습니다. ARC에서는 기본적으로 __strong으로 설정됩니다. 그 죄송합니다! 따라서 ARC 아래에서 대리인을 사용하는 모든 사람들에게 : 마이그레이션 도구가 당신을 위해 그것을하지 않으면 약하게하십시오! –

+0

미안 할 필요가 없습니다. 알아두면 유용합니다! 프로젝트를 이전해야 할 때를 대비해야 할 것입니다. – lxt

1

실제 코드가 표시되지 않으므로 루트보기 컨트롤러에서 어떤 일이 일어나는지 알기가 어렵습니다.

그러나 ARC를 사용하면 개체에 대한 강력한 포인터가 있으면 해제되지 않습니다. 나는 네가 네비게이션 컨트롤러에 추가 한 후에이 컨트롤러를 잡고 있다고 생각한다.

하지만 코드를 보지 않아도 알 수 없습니다.