ios - NSFetchedResultsController 随机崩溃并出现 NSInvalidArgumentException

标签 ios core-data crash nsfetchedresultscontroller

我有一个 iOS 应用程序,它使用 Core Data 将一些通过互联网下载的数据临时存储到数据库中。这些数据用于通过 NSFetchedResultsController 填充 UITableView。这是生成 Controller 的代码(放置在 UIViewController 中):

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

// Fetch results from database
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order" inManagedObjectContext:[self.appDelegate ordersObjectContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"patronName" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

// Prefetch size: tweak this to improve performance
[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self.appDelegate ordersObjectContext] sectionNameKeyPath:@"patronNameInitial" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

[entity release];
[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return fetchedResultsController;    

在我的应用程序工作流程中,这个 Controller 被包装到的 TableView 必须卸载和加载几次,这就是问题所在。一旦上下文被我的“订单”实体填充,如果我使用结果 Controller 来回切换到 View ,在从 View 堆栈推送和弹出几次后,应用程序崩溃并出现以下错误:

Fatal error. NSInvalidArgumentException. Entity name must not be nil.. User info: (null)

奇怪的是,对于 Controller 必须显示的给定数据集,崩溃在每次应用程序运行时恰好同时发生。示例:总是在第六次显示带有数据的 View 。

但是如果我的对象上下文没有同时改变,这怎么可能呢?为什么(示例)它在我第六次收到此错误时运行了 5 次?

请注意,我的托管对象上下文和模型由我的应用程序委托(delegate)拥有并且永远不会卸载,因此如果我没有明确修改它们,数据应该不会随时间改变。

也许问题是因为我实际上并没有将“订单”保存到数据库中,而是将它们保存在对象上下文中的内存中?我这样做是因为当应用程序停止时,必须删除下载的数据。

编辑 1: 我试图在崩溃发生前记录正确的行,并且

NSLog(@"%@", [[self.appDelegate managedObjectModel] entities]);

导致应用程序崩溃并显示 EXC_BAD_ACCESS,因此问题出现在 managedObjectModel 中。

编辑 2: 我尝试用超过 1500 个实体填充上下文,在加载和卸载 View 30 次后我没有发生任何崩溃。似乎只有当托管对象上下文只包含几个实体时我才会崩溃!这太奇怪了。

最佳答案

你不应该释放实体

[entity release];

由于您从未对其调用 alloc,因此您不拥有它。

关于ios - NSFetchedResultsController 随机崩溃并出现 NSInvalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311772/

相关文章:

ios - 使用 cocoapods swift 的链接器命令失败,退出代码为 1(使用 -v 查看调用)

ios - 如何在类方法中实现键值对的简单本地缓存?

ios - 显示应用程序首次打开的日期

iphone - 我可以将 NSManagedObject 变成单例吗?

ios - 无法将对象保存到 CoreData

docker - Kubernetes-通过php上传文件后nginx-ingress崩溃

android - NativeScript ListView : Mobile 1 column/Tablet 2 columns

ios - NSFetchedresultsController 部分 Name KeyPath 基于当前位置和其他位置之间的范围

android - ImageView 导致崩溃

android蓝牙聊天示例代码在手机上崩溃