Если я освобождаю, я получаю плохой доступ, если я сохраняю, я пропускаю
У меня есть контроллер представления, который я пытаюсь вставить в стек навигации. Я создаю контроллер с локальной переменной, устанавливаю его, а затем назначаю его свойству. Затем, если я освобождаю переменную, я получаю 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
Вот именно то, что произойдет, если я выпущу
- Приведенный выше код запускается от нажатия кнопки добавления в навигационной панели.
- вид толкается и все хорошо. В новом представлении я могу выдвигать больше представлений снова и снова без проблем... если только
- Я возвращаюсь к корневому представлению стека навигации. (Отсюда и вышеприведенный код).
- Теперь, если я снова углублюсь во второй вид, то попробую нажать другой, он вылетает.
Изменить: У меня есть ощущение, что что-то идет не так, когда я помещаю третий контроллер в стек. С помощью 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", то просто отпустите его, вы не получите никаких утечек после этого