Ваш сбой не является результатом этого кода.
Сбои в сохранениях обычно происходят из-за ошибки с атрибутами управляемого объекта. В этом случае вы где-то присвоили неверное значение строковому атрибуту. Когда контекст переходит для преобразования строкового атрибута в строку UTF8 для сохранения, объект, который находится там вместо NSString, не понимает сообщение и приводит к сбоям.
Хотя этот код должен работать нормально, у вас есть несколько рискованных практик:
NSFetchRequest *request = [[[NSFetchRequest alloc] init]autorelease];
Это плохая практика. autorelease
соответствует версии. Вы не должны посылать это объекту, пока не закончите с ним. autorelease
помечает объект для смерти в следующий раз, когда пул памяти будет очищен. В некоторых случаях это неожиданно убьет объект. Хотя здесь это не вызовет проблем, вы не захотите использовать этот короткий путь, потому что он в конечном итоге укусит вас.
Вы должны использовать autorelease только тогда, когда текущая область видимости сделана с объектом, но объект отправляется за пределы области видимости (обычно в методе return.)
NSMutableArray *mutableFetchResults = [[[model managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];
Изменяемый массив здесь бессмыслен, как и копия. Это, по-видимому, в каком-то справочном материале где-то, потому что он продолжает обрезать код новичков в последние несколько месяцев Если вы не собираетесь изменять массив, нет причин для его изменения. В случае массива управляемых объектов копировать массив бессмысленно.
videoList = [mutableFetchResults objectAtIndex:0]
Поскольку у вас нет дескриптора сортировки для выборки, массив mutableFetchResults будет в случайном порядке. Если вам возвращено более одного объекта, что почти всегда так, вы будете получать случайный объект TJVideoList
с нулевым элементом при каждом запуске кода.