Это старый вопрос, я боролся с этим в течение некоторого времени. Поэтому подумал, что было бы лучше документировать его.
As Weichsel вышеупомянутый, the Apple documentation справедливо указывает причина для этого исключения. Но это тяжелая задача определить модуль, из-за которого объект подкласса NSManagedObject сохраняется (если первая причина в документации является основной причиной проблемы).
Итак, я начал с определения частей моего кода, который сохранял NSManagedObject, вместо этого я сохранил NSManagedObjectID и создавал управляемый объект из него, когда это необходимо. Обсуждение в подобных линиях можно найти в Restkit документации:
- https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
- https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605
Обновленные мой и присваиватель, чтобы интерфейс с остальными модулями остается таким же, а внутренне мы теперь зависим при NSManagedObjectID и избежать удержаний из NSManageObject:
-(CSTaskAbstract*)task
{
CSTaskAbstract *theTask = nil;
if (self.taskObjectID)
{
NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
// https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 &
// https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605
NSError *theError = nil;
NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID
error:&theError];
if ([theObject isKindOfClass:[CSTaskAbstract class]])
{
theTask = (CSTaskAbstract*)theObject;
}
}
return theTask;
}
-(void)setTask:(CSTaskAbstract *)inTask
{
if (inTask!=self.task)
{
// Consequences of retaining a MO when it is detached from its MOC
[self setTaskObjectID:[inTask objectID]];
}
}
выше являются первыми галами f проблемы решена. Нам нужно выяснить зависимость в подозрительных частях нашего приложения и устранить.
Была и другая проблема: инструменты -> распределения - хороший источник, чтобы выяснить, какие модули фактически сохраняют управляемые объекты, объект исключения будет иметь сведения о том, какой управляемый объект создает проблему, результаты фильтрации для этого объект, как показано ниже:
Мы выполняли КВО на управляемом объекте. KVO сохраняет наблюдаемый управляемый объект, и, следовательно, исключение выбрасывается, и его след назад не будет изнутри нашего проекта. Это очень сложно отлаживать, но угадать работу и отслеживать распределение объекта и цикл сохранения-освобождения наверняка помогут. Я удалил часть наблюдения KVO, и все это начало работать.
Посмотрите на третий абзац здесь: [Ошибка не может быть выполнена] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –
Но как отлаживать и выяснить, какой именно модуль вызывает это исключение? –