我有一个 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/