2009-11-20 2 views
1

두 개의보기 컨트롤러 : MyParentViewControllerMyChildViewController이 있습니다._existingView 메시지가 할당 해제 된 개체로 전송되면 iPhone 회전으로 인해 충돌이 발생합니다.

신청서는 MyParent으로 시작됩니다.

MyParent>MyChild

내가 NSLog(@"%p", self)으로 MyChild의 오브젝트 ID를 기록 :

2009-11-20 05:08:29.305 MyApp[2213:207] MyChildViewController instance: 0x36afc20 

언제과 같이 체인이되도록 I는 탐색 스택의 최상위에 MyChild 제어기 밀어 MyChild에서 뒤로 버튼을 누르면 스택에서 MyChild이 튀어 나와 MyParent으로 돌아옵니다. 다음 오류 메시지와 함께

MyParent를 보는 동안 나는 아이폰을 회전

, 내 응용 프로그램 충돌 :

2009-11-20 05:08:37.671 MyApp[2213:207] *** -[MyChildViewController _existingView]: message sent to deallocated instance 0x36afc20 

나는 MyChildViewController에는 _existingView 방법 또는 인스턴스 변수가 없습니다.

스택에서 MyChild이 튀어 나오면 내비게이션 컨트롤러가이를 해제하고 nil으로 설정되고 전송 된 메시지가 무시된다는 것을 전제로합니다. 그것은 분명히 여기서 일어나지는 않지만.

아무도 내 응용 프로그램이 회전시 충돌되는 이유가 있습니까?

_existingView 메시지를 MyChild (으)로 보내는 것을 확인하는 방법이 있습니까? 나는이 문제를 해결 한 수 생각 2

MyChildViewController *_myChildViewController = [[MyChildViewController alloc] initWithNibName:@"MyChildViewController" bundle:nil]; 
_myChildViewController.managedObjectContext = self.managedObjectContext; 
_myChildViewController.title = [_xyz name]; 
[self.navigationController pushViewController:_myChildViewController animated:YES]; 
UIBarButtonItem *_backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"MyChildViewBackBarButtonItemTitle", @"") style:UIBarButtonItemStyleDone target:nil action:nil]; 
self.navigationItem.backBarButtonItem = _backButton; 
[_backButton release]; 
[_myChildViewController release]; 

편집 :

편집

여기 스택에 MyChild을 밀어 코드입니다. Interface Builder를 통해 뷰 컨트롤러 nib에 UISearchDisplayController을 추가했습니다. MyChild 컨트롤러는이 방법에 전무에 IBOutlet 인스턴스를 설정하는 것이 일반적으로 충분하다 생각 -viewDidUnload을 보낼 때

원래, 나는 nil로 설정. 하지만 내 검색 디스플레이 컨트롤러에는 충분하지 않은 것으로 보입니다. 내가 이것을 -dealloc에서 공개 할 때 나는 충돌을 얻지 못한다. 이것은 버그입니까, 궁금하거나 기대하는 행동입니까?

+0

childViewController를 밀 때 코드가 정확히 어떻게 생깁니 까? childViewController가 parentViewController 클래스의 필드입니까? –

답변

1

은 (here을 발견)라는 사람에 대한 자세한 내용을 찾을 수있는 방법이있다 :

[...]이 또한 앱이 가 포착되지 않은 예외로 인해 종료 된 시간이 없음 유용한 백 트레이스. objc_exception_throw에 중단 점을 설정하면 예외가 던져지기 전에 디버거가 실행되고 이면 유용한 백 트레이스를 사용할 수 있습니다. I .gdbinit 파일을 사용하여이 작업을 수행하십시오. .gdbinit라는 파일을 만들어 홈 디렉토리 에 넣습니다. 이 광산의 내용입니다 :

  • FB - [NSException 인상]
  • FB - [_ NSZombie 출시]
  • FB의 szone_error
  • FB objc_exception_throw

그것은 설정할 수도 있습니다 Xcode 중단 점 창 또는 디버거 콘솔에 이러한 종류의 중단 점 이 있습니다. [...]

그러나 문제가 해결되지 않을 것이라고 가정합니다. _existingView는 전화를 돌릴 때 프레임 워크에서 호출되는 것으로 보입니다. _myChildController에서이 작업을 수행하도록 프레임 워크에 알리는 유일한 방법은 다음과 같습니다.

myChildViewController.managedObjectContext = self.managedObjectContext; 

이 작업을 수행하지 않으면 작동하지 않습니까?

0

_existingView
UIViewController.h 어쩌면 당신은 당신의 코드에 MyChildViewController 곳을 유지하는에 정의의 UIViewController 인스턴스의 내부 변수입니다.

+0

나는 많은 것을 알았다. 이 메시지를 무엇이 보내고 있는지 아십니까? –

+0

내가 아는 한, MyChildViewController를 적극적으로 보유하지는 않습니다. 네비게이션 컨트롤러가 소유권을 얻은 직후에 해제됩니다. –

0

나는 이것으로도 고심하고 있었고 해결책은 Alex Reynolds와 비슷했습니다. -dealloc 메서드에서 UISearchDisplayController를 해제했지만 [슈퍼 dealloc] 전에 이어야했습니다. 슈퍼 할당 해제 후 을 릴리스하면 여전히 충돌합니다.

관련 문제