好事实:
- 我从服务器下载数据,并通过 Core Data 线程限制保存数据,当后台 MOC 被保存时,主 MOC 被合并。
- 所有的保存操作都正常
- MOC的合并也没有任何问题
我正在寻找的错误:
- 当我的带有 NSFetchedResultsController 的 UITableView 处于活动状态(即在屏幕上)并且正在保存时,应用程序崩溃并出现 SIGABRT,它将我带到 AppDelegate 中的 mergeChangesFromContextDidSaveNotification 行。
- 最奇怪的是,当 FRC 的委托为 nil 时,或者当它是我的视图控制器但我没有实现任何 FRC 委托方法时,不会发生崩溃并且我没有任何问题. 但是当我实现任何委托方法(甚至是空的,没有一行代码)时,应用程序会因相同的错误而崩溃。这意味着这些方法甚至没有被触发,问题不在于这些方法内部的代码。
- 最奇怪的第 2 部分(检查下面的更新 2):崩溃发生在 a
[__NSCFNumber length]: unrecognized selector sent to instance
并且我在我的 CoreDataManager 中也没有在我的 AppDelegate 类中调用任何“长度”属性
证人:控制台
<CoreDataManager.m:(338)> Saved data from server
<AppDelegate.m:(352)> Will merge
<CoreDataManager.m:(338)> Saved data from server
<AppDelegate.m:(355)> Did merge
<CoreDataManager.m:(338)> Saved data from server
<AppDelegate.m:(352)> Will merge
<AppDelegate.m:(355)> Did merge
<CoreDataManager.m:(338)> Saved data from server
<CoreDataManager.m:(338)> Saved data from server
<CoreDataManager.m:(338)> Saved data from server
<MyTableViewController.m:(134)> Fetched results controller did fetch
<CoreDataManager.m:(338)> Saved data from server
<CoreDataManager.m:(338)> Saved data from server
<CoreDataManager.m:(338)> Saved data from server
<AppDelegate.m:(352)> Will merge
<CoreDataManager.m:(338)> Saved data from server
[__NSCFNumber length]: unrecognized selector sent to instance 0x13318050
一些代码 - 合并 MOC
- (void)managedObjectContextDidSave:(NSNotification *)notification
{
NSManagedObjectContext *sender = (NSManagedObjectContext *)[notification object];
if ((sender != self.managedObjectContext) &&
(sender.persistentStoreCoordinator == self.managedObjectContext.persistentStoreCoordinator))
{
dispatch_async(dispatch_get_main_queue(), ^{
DebugLog(@"Will merge");
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
DebugLog(@"Did merge");
});
}
}
更新 1
按照 Cocoanetics 的提示,我创建了一个 NSNumber 类别来检查谁在调用length
. 我得到了您在下面看到的内容,并且[__NSCFNumber _fastCStringContents:]: unrecognized selector sent to instance发生了崩溃。
更新 2 启用僵尸没有帮助 =(