当我在NSFetchedResultsController上调用-performFetch时,我遇到了一个可重复的崩溃,看起来像是与数据相关的崩溃:
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:sectionnamekeypath
cacheName:cacheName];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (NO == [aFetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
它在performFetch()调用时崩溃。我打开了僵尸检查,它打印了:
*** -[CFString isNSString__]: message sent to deallocated instance 0x12c6071d0
我检查了函数中的所有字符串,但找不到具有该地址的字符串。我对所有字符串沿着地址位置进行了NSLog()处理。我认为它会在引用有问题字符串的任何NSLog()行上中断,但所有字符串仍然有效。
这让我觉得这是NSFetchedResultsController.performFetch()内部的问题,但是很难想象他们会有这样的bug。那么,我还能做些什么来找出这是什么字符串呢?
自从我们切换到ARC后,我还没有遇到过这样的问题。我不知道如何找出这个字符串的来源。
不过看起来这似乎与数据有关。我的应用程序从服务器上提取数据,导入Core Data,然后使用NSFetchedResultsController在UITableView中显示数据。我可以以各种不同的用户身份登录,下载他们的数据,FRC可以很好地获取和工作。但当我以这个特定用户的身份登录时,然后它就崩溃了。这个用户是我们最大的用户之一,他们的数据集有成千上万条记录,所以我不容易通过它来直观地发现可能奇怪的东西。正在做进一步的测试,如果我发现任何新的信息,我会更新它。
1条答案
按热度按时间nhjlsmyf1#
我不知道这是怎么回事,可能有人谁了解NSString和CFString之间的关系可以解释给我听。
我的FRC(NSFetchedResultsController)将一个
sectionNameKeyPath
传递给初始化程序,以便它自动将结果分解为适合我的表视图的部分。sectionNameKeyPath
是namefirstletter
,这是我在所有Core Data对象的基类中定义的方法。在我的
-namefirstletter
方法中,我在最后有以下代码:这段代码已经运行了6年多,从来没有出现过问题。但是突然出现了问题,所以我想知道最新的iOS是否有变化。现在,当我在sectionNameKeyPath函数中使用上面的代码执行FRC时,它每次都崩溃。
不过,这就修复了它:
现在它每次都起作用了。
-uppercaseString
是否返回了一个不正确管理的引用?有人能给我解释一下吗?