Обычно, с интерфейсом Master-Detail, поддерживаемым Базовыми данными, вы не выбираете для представления Подробности.
Когда вы выбираете строку в главном табличном представлении, вы выбираете конкретный экземпляр управляемого объекта. Затем вы передаете этот экземпляр управляемого объекта в подробный вид. Нет необходимости повторно выбирать объект, выбранный в представлении таблицы.
Хороший пример этого - приложение «Контакты». Главный табличный вид будет списком объектов Contact (с отображением имени). Когда вы выбираете строку, главный контроллер табличного представления берет конкретный объект Contact, связанный с выбранной строкой, а затем передает его в контроллер представления Detail, который затем заполняет Detail просмотр с использованием данных, взятых из свойств переданного объекта Contact.
Итак, весь блок кода, в котором возникает ошибка, не нужен.
Однако немедленная ошибка в этом коде заключается в том, что вы освобождаете объект, который не создали. В этой строке:
NSArray *objects = [context executeFetchRequest:request error:&error];
... вы не создаете экземпляр NSArray с помощью метода init
, new
или create
. Вместо этого вы просто получаете автоматически выпущенный экземпляр NSArray, созданный и возвращенный экземпляром context
NSManagedObjectContext. Когда вы отпускаете объект, который вы не создали здесь:
[objects release];
... вы вызвали аварию.
И наоборот, вы создаете NSFetchRequest здесь:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
... потому что вы использовали init
, поэтому вы должны сбалансировать это с:
[request relwase];
Кстати, этот тип кода не следует вводить в viewDidLoad
, поскольку метод вызывается только при первом чтении представления из файла пера на диске. Это гарантированно произойдет только один раз, поскольку представление может остаться в памяти, когда пользователь переключается на другое представление. Вместо этого поместите код, который должен запускаться каждый раз, когда представление появляется в viewWillAppear
.