Освобожденный контроллер представления, вызывающий EXC_BAD_ACCESS из-за обновления контроллера извлеченных результатов

У меня есть приложение для навигации с 3 контроллерами представления в стеке. Корень навигации толкает AvailableItemsViewController, передавая ему контекст управляемого объекта.

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

В CreateNewItemViewController я создаю управляемый объект, сохраняю его в контексте, а затем открываю контроллер представления.

Я могу перемещаться вперед и назад, сохраняя элементы в AvailableItemsViewController, пока не вернусь в корень навигации. (ДоступныйItemsViewController освобождается).

После этого, если я вернусь к третьему контроллеру и попытаюсь сохранить, я получу следующее:

Вот моя ошибка (зомби включены :)

- [AvailableItemsViewController controllerWillChangeContent:]: сообщение отправлено освобожденному экземпляру 0x1f6500

и без зомби

- [__ NSArrayM controllerWillChangeContent:]: нераспознанный селектор отправлен в экземпляр 0x4ecdee0

(я получил много разных случайных результатов по этому поводу, кажется, что адресат сообщения controllerWillChangeContent: случайный)

все контроллеры устанавливают свои свойства равными нулю и освобождают ivars в viewDidUnload и dealloc соответственно.

При пошаговом прохождении сбой происходит в [self.managedObjectContext save: & error] в третьем контроллере (CreateNewItemViewController)


person Myron Slaw    schedule 17.05.2011    source источник
comment
Интересно, если установка делегата увеличивает счетчик удержания ...   -  person Myron Slaw    schedule 17.05.2011


Ответы (2)


Как упоминалось выше, убедитесь, что ваш FRC не протекает. Однако, если проблема не исчезнет, ​​установите для делегата FRC значение nil в файле dealoc вашего контроллера. Это отключит отслеживание изменений и предотвратит вызовы вашего освобожденного виртуального канала.

person Scott Ahten    schedule 18.05.2011
comment
Да, вот и все, вчера я во всем разобрался. Инструменты в версии Xcode Lion не работают, поэтому я перенес проект на другой компьютер, чтобы использовать зомби. Обнаружено, что что-то в основных данных все еще отправляет сообщения старому контроллеру представления, поэтому я решил, что это делегат FRC. stackoverflow.com/questions/6006028/ - person Myron Slaw; 19.05.2011
comment
Также полезно при использовании ARC. Была аналогичная проблема, и я попытался обнулить делегата в viewWillDissappear. Удачи в dealloc! Большое спасибо! - person FeltMarker; 14.08.2012

У вас утечка NSFetchedResultsController. Это означает, что он остается активным, и когда что-то меняет хранилище данных, он выполняет свою работу и пытается сигнализировать об изменении. Но поскольку делегат был освобожден, вы получаете EXC_BAD_ACCESS или сообщения, отправленные любому случайному объекту, который был выделен в этой области памяти.

person Anomie    schedule 17.05.2011
comment
Так есть ли что-то, чем я должен заниматься в dealloc, кроме выпуска ivars? (и просмотр сделал выгрузку) - person Myron Slaw; 17.05.2011
comment
Я как выпущен, так и установлен в nil в dealloc и viewDidUnload - person Myron Slaw; 17.05.2011
comment
@LoneGunman: Но правильно ли вы управляете памятью при ее распределении? Если вы работаете через ivars, убедитесь, что вы освободили старое значение перед назначением нового? - person Anomie; 17.05.2011