Если я освобождаю, я получаю плохой доступ, если я сохраняю, я пропускаю

У меня есть контроллер представления, который я пытаюсь вставить в стек навигации. Я создаю контроллер с локальной переменной, устанавливаю его, а затем назначаю его свойству. Затем, если я освобождаю переменную, я получаю EXE_BAD_ACCESS. если я сохраняю (или автоматический выпуск), это протекает.

CustomTVC* controller = [[CustomTVC alloc]initWithStyle:UITableViewStyleGrouped];
controller.managedObjectContext = self.managedObjectContext;

self.tableViewControllerIvar = controller;

[self.navigationController pushViewController:self.tableViewControllerIvar animated:YES];
 //[controller autorelease]; or [controller release]; or nothing

Вот именно то, что произойдет, если я выпущу

  1. Приведенный выше код запускается от нажатия кнопки добавления в навигационной панели.
  2. вид толкается и все хорошо. В новом представлении я могу выдвигать больше представлений снова и снова без проблем... если только
  3. Я возвращаюсь к корневому представлению стека навигации. (Отсюда и вышеприведенный код).
  4. Теперь, если я снова углублюсь во второй вид, то попробую нажать другой, он вылетает.

Изменить: У меня есть ощущение, что что-то идет не так, когда я помещаю третий контроллер в стек. С помощью push он вставляет новый объект в контекст управляемого объекта, что заставляет контроллер fetchedresults обновлять представление таблицы. Там может быть где-то сломанный указатель. Я поиграюсь с ним и выложу результаты. -

Изменить: 5/16

Получение этого сообщения об ошибке в журнале

* - [CustomTVC controllerWillChangeContent:]: сообщение отправлено на освобожденный экземпляр 0x187270

Это происходит только после того, как я вытаскиваю CustomTVC из стека (возвращаюсь к контроллеру корневого представления навигации), я могу нажать и сохранить все, что хочу, до тех пор, пока я не вытолкну CustomTVC.

3 ответа

Решение

Починил это. Пришлось установить делегат полученных результатов контроллеров в ноль в viewDidLoad.

- (void)dealloc
{
    self.fetchedResultsController.delegate = nil;
    [_fetchedResultsController release];
    [_managedObjectContext release];
    [super dealloc];
}

Кажется, виновник был (согласно инструментам зомби):

[NSFetchedResultsController (закрытые методы) _managedObjectContextDidChange:]

Редактировать (ы): Наконец, нашли время, чтобы выяснить, как правильно разместить код здесь (я ленивый)

autorelease должен получить работу. Когда вы назначаете tableViewControllerIvarВы можете просто позвонить [controller autorelease], Это должно позаботиться об этом.

CustomTVC* controller = [[CustomTVC alloc]initWithStyle:UITableViewStyleGrouped];
controller.managedObjectContext = self.managedObjectContext;

self.tableViewControllerIvar = [controller autorelease];

[self.navigationController pushViewController:self.VCTVC animated:YES];

Если вы все еще получаете EXE_BAD_ACCESS, то должно произойти что-то еще. Вы абсолютно подтвердили, что этот код, при запуске более одного раза, вызывает плохой доступ?

Вы назначаете контроллер для tableViewControllerIvar

 self.tableViewControllerIvar = controller;

и вы отпускаете контроллер, поэтому вам нужно сохранить его в приведенной выше строке

 self.tableViewControllerIvar = [controller retain];

и когда вы закончите со своим "tableViewControllerIvar", то просто отпустите его, вы не получите никаких утечек после этого

Другие вопросы по тегам