使用“NSInvalidArgumentException”保存 managedObjectContext 时崩溃,但只是偶尔

Posted

技术标签:

【中文标题】使用“NSInvalidArgumentException”保存 managedObjectContext 时崩溃,但只是偶尔【英文标题】:Crashing on saving a managedObjectContext, with 'NSInvalidArgumentException', but only sporadically 【发布时间】:2010-08-20 16:02:08 【问题描述】:

我不断收到来自 managedObjectContext 上的 save: 命令的崩溃。它甚至不满足 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 并没有帮助。

任何关于从哪里开始寻找解决方案的想法将不胜感激!

【问题讨论】:

【参考方案1】:

看起来您正在释放UIViewController,而不是释放其关联的NSFetchedResultsControllerNSFetchedResultsController 正在尝试通知其代表(很可能是您的 UIViewController)退出时保存。

【讨论】:

是的,问题肯定是获取的结果控制器正在向不理解该消息的对象发送用于 UITableView(或其数据源或委托)的消息。它确实与 Core Data 没有任何直接关系。 非常感谢你们...如果我理解正确,某些东西(如 UIViewController 或数据源或委托)在不应该发布的时候被释放,所以我应该尝试追捕不应该存在的自动释放或释放语句,或插入“保留”语句以将某些对象保留足够长的时间? (NSFetchedResultsController 从来没有真正达到保存的目的。)【参考方案2】:

要详细说明 Marcus 的回答,您需要确保在视图消失时为您的 NSFetchedResultsController 取消委托:

- (void)viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];

    self.fetchedResultsController.delegate = nil;

【讨论】:

以上是关于使用“NSInvalidArgumentException”保存 managedObjectContext 时崩溃,但只是偶尔的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份