Предотвращение сбоя плохого доступа для popViewController. Анимированные в настройках uinavigationcontroller - PullRequest
1 голос
/ 03 апреля 2011

Итак, при низком объеме памяти мой корневой вид выгружается. Это ожидается и учитывается. Тем не менее, как мне поступить с контроллерами модального / push-представления, которые нужно вытолкнуть, так как они ссылаются на основной navigationController? У меня есть пользовательская кнопка «Готово» в контроллере push-представления, которая вызывает [self.navigationController popViewControllerAnimated: YES]. Если корневое представление было выгружено, это выдает ошибку неверного доступа. Есть ли лучший способ сделать это?

Моя настройка AppDelegate имеет NavigationController этот NavigationController имеет контроллер представления MainViewController

//MainViewController.m
- (IBAction)showAnotherController:(id)sender
{
    AnotherViewController *   anotherViewController;
    anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];

    [self.navigationController pushViewController:anotherViewController animated:YES];
    [anotherViewController release];
}

//...Here I can simulate a memory warning to force unloading of MainViewController's view

//in AnotherViewController.m, called from a custom toolbar item
- (IBAction)done:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES]; // bad access here, looks like self.navigationController is no longer available. Am I doing this wrong?

}

1 Ответ

2 голосов
/ 03 апреля 2011

Сценарий, который вы описываете, не вызывает плохого доступа. Однако, если вы не будете внимательно относиться к описанному сценарию, вы получите плохой доступ. Поскольку вы не показали мне никакого кода, я не могу сказать вам, что это ваша проблема, но это очень распространенная проблема.

Когда вы получаете предупреждение памяти и ваше представление не загружено, вы, вероятно, выпускаете кучу вещей. В дополнение к освобождению переменных вы также должны установить их на ноль. В противном случае вы рискуете отправить сообщения освобожденным объектам, что приведет к плохому доступу.

Опять же, я не могу знать, что это ваша проблема, но обычно это проблема.

РЕДАКТИРОВАТЬ: Поскольку вы, похоже, считаете, что self.navigationController не существует (вероятно, существует), я расскажу вам о чем-то, называемом NSZombie:

NSZombie сообщит вам, какому освобожденному объекту отправляется сообщение (иначе EXC_BAD_ACCESS). Это очень полезный инструмент, когда вы получаете EXC_BAD_ACCESS, поэтому научитесь его использовать.

Чтобы активировать NSZombie, выполните следующие действия:

  1. Получить информацию об исполняемом файле.
  2. Перейти на вкладку аргументов.
  3. В разделе «Переменные, которые должны быть установлены в среде:» добавить:

Имя: NSZombieEnabled Значение: ДА

Затем запустите ваше приложение как обычно, и когда оно выйдет из строя, оно должно сообщить вам, какой освобожденный объект получил сообщение.

...