使用“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
,而不是释放其关联的NSFetchedResultsController
。 NSFetchedResultsController
正在尝试通知其代表(很可能是您的 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)