EXC_BAD_ACCESS после вызова popViewControllerAnimated - PullRequest
0 голосов
/ 20 августа 2010

Я получаю EXC_BAD_ACCESS после вызова dismissModalViewControllerAnimated на моем контроллере представления. Мой проект основан на начальном проекте табличного представления, и RootViewController создает такое представление:

GobanVC *vc = [[GobanVC alloc] initWithNibName:@"GobanVC" bundle:[NSBundle mainBundle] coll:c];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

В GobanVC.m я обрабатываю кнопку, чтобы закрыть вид:

- (IBAction) onDone:(id) sender;
{
    [self.navigationController popViewControllerAnimated:YES];
}

По какой-то причине объект GobanVC перегружен. Я запустил инструмент распределения, и я вижу, что счетчик ссылок устанавливается в 1, когда я вызываю alloc, затем вызовы UIKit сохраняют / освобождают кучу раз, а затем мой выпуск выше обрабатывается. После этого ни один из сохраняемых или выпусков не входит в мой код, и после popViewControllerAnimated в конечном итоге счетчик становится равным -1.

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 августа 2010

Давайте посчитаем остатки:

  1. Alloc делает это 1.
  2. Релиз равен 0.

Итак, то, что выходит из стека при вызове pop, будет иметь счетчик сохранения, равный 0, а это НЕ то, что вы хотите. Если вы удаляете release или сохраняете его и назначаете «vc» переменной экземпляра, определенной как свойство «retain», все будет в порядке.

Из предоставленного вами кода я вижу следующее:

  1. Корневой контроллер создает экземпляр GobanVC. Счет удержания GobanVC равен 1.

  2. Корневые контроллеры помещают экземпляр GobanVC в стек навигации. Я не уверен, увеличивает ли толчок удержание. Скорее всего, да. Тогда счет сохранения экземпляра GobanVC становится равным 2.

  3. Вы отпускаете экземпляр GobanVC, устанавливая его счетчик в 1.

  4. Ваш обработчик кнопок находится в GobanVC (не в корневом контроллере). Таким образом, GobanVC выталкивает САМ из стека с сохранением счетчика 0 (потому что, если push увеличивает счетчик, pop уменьшит его). Это проблема.

0 голосов
/ 20 августа 2010

Возможно, что-то не так с GobanVC. Есть ли у вас реализация для этого?

Потому что, если есть сохранение для каждого выпуска UIKit (должно быть). И вы говорите, что ваши звонки также сбалансированы (один alloc и один release).

Тогда это означает, что в реализации GobanVC должно быть что-то не так.

...