Сбой при сохранении manageObjectContext с «NSInvalidArgumentException», но только спорадически

Я продолжаю получать сбои из команды save: в manageObjectContext. Он даже не выполняет оператор NSLog, поэтому я не вижу неразрешенного оператора ошибки, поэтому я не могу понять, в чем может быть проблема. Это происходит не каждый раз, а лишь эпизодически.

Вот код (который в основном хочет увеличить счетчик):

 if ([[managedObject valueForKey:@"canSee"]boolValue]){
    int read = [[managedObject valueForKey:@"timesRead"] intValue] +1;
    [managedObject setValue:[NSNumber numberWithInt:read] forKey:@"timesRead"]; 


    NSError *error;
    if (![resultsController.managedObjectContext save:&error]) {  //<-- crashes on this line!
        NSLog(@"Unresolved Core Data Save error %@, %@", error, [error userInfo]);
        exit(-1);
    }

В окне консоли получаю такие сообщения:

  2010-08-20 08:12:20.594 AppName[23501:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet controllerWillChangeContent:]: unrecognized selector sent to instance 0xe54f560'

или это:

  2010-08-20 08:12:20.594 AppName[23501:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet controllerWillChangeContent:]: unrecognized selector sent to instance 0xe54f560'

или даже это:

  2010-08-19 23:09:59.337 AppName[761:307] Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[UITableViewLabel controllerWillChangeContent:]: unrecognized selector sent to instance 0x7f0a860 with userInfo (null)
  2010-08-19 23:09:59.356 AppName[761:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewLabel controllerWillChangeContent:]: unrecognized selector sent to instance 0x7f0a860'

Затем он показывает стек вызовов при первом броске, за которым следует уведомление (завершение вызова после создания экземпляра «NSException», «[Переключение на процесс 23501]» и «Программа полученного сигнала: «SIGABRT».'

Я думаю, что проблема как-то связана с CoreData, но я не уверен. Я очистил свою сборку и цели, и это, похоже, не помогает. Я пытался заблокировать/разблокировать ManagedObjectContext, и это не помогает.

Любые идеи здесь о том, где начать искать решение, будут очень признательны!


person frandogger    schedule 20.08.2010    source источник


Ответы (2)


Похоже, вы выпускаете UIViewController и не выпускаете связанный с ним NSFetchedResultsController. NSFetchedResultsController пытается уведомить своего делегата (скорее всего, вашего UIViewController) о сохранении при выходе.

person Marcus S. Zarra    schedule 20.08.2010
comment
Да, проблема определенно заключается в том, что полученный контроллер результатов отправляет сообщение, предназначенное для UITableView (или его источника данных или делегата), объектам, которые не понимают сообщения. На самом деле это не имеет прямого отношения к Core Data. - person TechZen; 21.08.2010
comment
Большое спасибо вам обоим ... если я правильно понимаю, что-то (например, UIViewController или источник данных или делегат) выпускается, когда этого не должно быть, поэтому я должен попытаться выследить операторы автоматического выпуска или выпуска, которые не должны быть там или вставить оператор «сохранить», чтобы удерживать какой-либо объект достаточно долго? (На самом деле NSFetchedResultsController никогда не доходит до точки сохранения.) - person frandogger; 22.08.2010

Чтобы уточнить ответ Маркуса, вам нужно убедиться, что вы отключили делегата для вашего NSFetchedResultsController, когда ваше представление исчезнет:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    self.fetchedResultsController.delegate = nil;
}
person DiscDev    schedule 16.02.2013