Ceci est une vieille question, j'ai lutté résoudre ce problème depuis un certain temps maintenant. Donc, pensé qu'il serait préférable de le documenter.
Comme Weichsel mentionné ci-dessus, the Apple documentation souligne à juste titre la raison de cette exception. Mais c'est un travail trépidant d'identifier le module à cause duquel l'objet de la sous-classe NSManagedObject est retenu (si la première raison citée dans la documentation est la cause profonde du problème). Par conséquent, j'ai commencé par identifier les parties de mon code qui conservaient NSManagedObject, mais j'ai conservé l'objet NSManagedObjectID et j'en ai créé l'objet géré chaque fois que cela était nécessaire. La discussion en ligne similaires peuvent être trouvées dans la documentation Restkit:
- https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
- https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605
mis à jour mon setter et getter pour que l'interface avec le reste des modules restent même en interne, nous dépendons maintenant sur NSManagedObjectID et éviter de conserver 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]];
}
}
Ce qui précède est le premier hal f du problème résolu. Nous devons trouver la dépendance dans les parties suspectes de notre application et éliminer. Il y avait un autre problème aussi, instruments -> allocations est une bonne source pour trouver quels modules sont en train de conserver les objets gérés, l'objet exception aurait des détails sur quel objet géré crée le problème, filtre les résultats pour cela objet comme indiqué ci-dessous:
Nous jouions KVO sur un objet géré. KVO conserve l'objet géré observé et, par conséquent, l'exception est levée et sa trace arrière ne proviendrait pas de notre projet. Ils sont très difficiles à déboguer, mais devinez le travail et le suivi du cycle d'allocation et de rétention-libération de l'objet vous aidera sûrement. J'ai enlevé la partie d'observation du KVO et tout a commencé à fonctionner.
Regardez le troisième paragraphe ici: [Défaut ne peut pas être rempli] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –
Mais comment déboguer et savoir quel est le module exact à l'origine de cette exception? –