2009-11-20 1 views
1

У меня есть два контроллера вида: MyParentViewController и MyChildViewController.Почему ротация iPhone вызывает сбой при отправке сообщения _existingView на освобожденный объект?

Приложение начинается с MyParent. Я толкаю контроллер MyChild к началу навигации стека, так что цепь следующим образом:

MyParent>MyChild

входе идентификатор объекта MyChild с NSLog(@"%p", self):

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

When Я нажимаю кнопку «Назад» от MyChild, это выталкивает MyChild со стека и возвращает меня в MyParent.

Когда я повернуть iPhone во время просмотра MyParent, мои приложения рушится с сообщением об ошибке:

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

У меня нет _existingView метода или переменной экземпляра в MyChildViewController.

Если я вытащил MyChild со стека, я думаю, что контроллер навигации выпустит его, и я полагаю, что он будет установлен в nil и что любые отправленные сообщения будут игнорироваться. Очевидно, это не происходит здесь.

Есть ли у кого-нибудь идеи, почему мое приложение вылетает при вращении?

Есть ли способ узнать, что отправляет сообщение _existingView на номер MyChild?

EDIT

Вот код для толкания MyChild на стек:

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]; 

EDIT 2

Я думаю я, возможно, решили эту проблему. У меня есть UISearchDisplayController, добавленный в контроллер контроллера просмотра через Interface Builder.

Первоначально, я поставил это nil, когда контроллер MyChild отправляется -viewDidUnload, думая, что это обычно достаточно, чтобы установить IBOutlet экземпляров к нулю в этом методе. Но этого, похоже, недостаточно для моего контроллера отображения поиска. Когда я отпущу это в -dealloc, я не получаю авария. Это ошибка, интересно или ожидаемое поведение?

+0

Что именно выглядит код при нажатии childViewController? Является ли childViewController полем класса parentViewController? –

ответ

1

Существует способ, чтобы узнать больше о том, кто называется (найдено here):

[...] Кроме того, к тому времени, когда приложение прекращено из-за неперехваченный исключения нет полезный заднийtrace. Если вы установите точку останова на objc_exception_throw, отладчик будет перерыв до того, как будет сброшено исключение , и у вас будет полезная обратная трассировка. I сделайте это с помощью файла .gdbinit. Создайте файл с именем .gdbinit и поместите его в в ваш домашний каталог. Это является содержание шахты:

  • фб - [NSException рейз]
  • фб - [_ NSZombie релиз]
  • фб szone_error
  • фб objc_exception_throw

Также можно установить эти виды точек останова в окне Xcode или в отладчике консоли. [...]

Но я предполагаю, что это не решит вашу проблему ... _existingView, по-видимому, вызывается каркасом при повороте телефона. Единственная линия, которую я могу думать о говорить рамки для выполнения этого на _myChildController это одна:

myChildViewController.managedObjectContext = self.managedObjectContext; 

ли не работать без этого?

0

_existingView является внутренняя переменная экземпляра UIViewController, определенный в UIViewController.h
Может быть, вы сохранить свой MyChildViewController где-нибудь в вашем коде.

+0

Я понял столько же. Вы знаете, что отправляет это сообщение? –

+0

Насколько я знаю, я не активно сохраняю 'MyChildViewController'. Он освобождается сразу же после того, как навигационный контроллер переходит в собственность. –

0

Я тоже боролся с этим, и решение было похоже на Алекс Рейнольдс. Я освобождаю свой UISearchDisplayController на методе -dealloc, но он должен был быть до [super dealloc]. Если я выпущу его после супер освобождение, он по-прежнему падает.