ios 由于-[CFString是NSString__],执行Fetch()时出现EXC_BREAKPOINT:消息已发送到已取消分配的示例

7lrncoxx  于 2022-11-26  发布在  iOS
关注(0)|答案(1)|浏览(108)

当我在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可以很好地获取和工作。但当我以这个特定用户的身份登录时,然后它就崩溃了。这个用户是我们最大的用户之一,他们的数据集有成千上万条记录,所以我不容易通过它来直观地发现可能奇怪的东西。正在做进一步的测试,如果我发现任何新的信息,我会更新它。

nhjlsmyf

nhjlsmyf1#

我不知道这是怎么回事,可能有人谁了解NSString和CFString之间的关系可以解释给我听。
我的FRC(NSFetchedResultsController)将一个sectionNameKeyPath传递给初始化程序,以便它自动将结果分解为适合我的表视图的部分。
sectionNameKeyPathnamefirstletter,这是我在所有Core Data对象的基类中定义的方法。
在我的-namefirstletter方法中,我在最后有以下代码:

NSString *uppercasefirstletter = [firstletter uppercaseString];
return uppercasefirstletter;

这段代码已经运行了6年多,从来没有出现过问题。但是突然出现了问题,所以我想知道最新的iOS是否有变化。现在,当我在sectionNameKeyPath函数中使用上面的代码执行FRC时,它每次都崩溃。
不过,这就修复了它:

NSString *uppercasefirstletter = [NSString stringWithString:[firstletter uppercaseString]];
return uppercasefirstletter;

现在它每次都起作用了。
-uppercaseString是否返回了一个不正确管理的引用?有人能给我解释一下吗?

相关问题