gpt4 book ai didi

iphone - 为什么 NSFetchedResultsController PerformFetch : crashing when recreating an NSFetchedResultsController with an equivalent NSFetchRequest?

转载 作者:行者123 更新时间:2023-12-03 19:01:39 27 4
gpt4 key购买 nike

使用等效的 NSFetchRequest 重新创建 NSFetchedResultsController 时,为什么 [NSFetchedResultsController PerformFetch:] 会崩溃?

我有一个应用程序,它有一个线程(消息线程)的 TableView Controller 。当您点击一个线程时,它会加载另一个 TableView Controller ,该 Controller 使用 NSFetchedResultsController 来获取该线程的所有消息并显示它们。我使用 NSFetchedResultsController 因为我可以在后台加载消息/删除/添加新消息,而根本不用担心显示它们。

第二个 TableView Controller 用于所有线程,因此当我点击返回然后点击另一个线程时,我只需删除当前的 NSFetchedResultsController 并为新线程设置一个新的。

以下是重现崩溃的步骤:

  1. 点击一个话题,它就会向我显示消息。
  2. 重新加载消息,以便 NSFetchedResultsController 用于显示新消息。
  3. 回去吧。
  4. 点击另一个话题。
  5. 回去吧。
  6. 点击第一个线程。

点击时,将创建与第一个相同的 NSFetchedResultsController。 (相同的缓存和一切)。它应该给出此错误并崩溃,而不是像它那样工作:

程序收到信号:“EXC_BAD_ACCESS”。

NSFetchedResultsController 正在向已释放的对象发送消息。

这是堆栈跟踪:

#0  0x95ffd688 in objc_msgSend
#1 0x0060699b in -[NSFetchedResultsController(PrivateMethods) _computeSectionInfo:error:]
#2 0x00601bf0 in -[NSFetchedResultsController performFetch:]
#3 0x0001c170 in -[CMNewMessagesViewController loadMessagesViewControllerForThread:showProfile:] at CMNewMessagesViewController.m:331

3是我的方法

有什么想法吗?任何帮助将不胜感激。

<小时/>

已解决!

都是我的错。我使用的是从另一个键值派生的sectionNameKeyPath。只要 NSFetchRequest 按该键值排序就可以。问题是它是动态生成的,因为我不想为其浪费数据库空间。我在 NSManagedObject 类中使用了一个实例变量,该变量已被 didTurnIntoFault 清理。

现在,我认为实例变量必须先被创建,然后被丢弃,然后在某个时刻重新创建,从而使 NSFetchedResultsController 的排序陷入停顿。

这解释了为什么没有使用sectionNameKeyPath或委托(delegate)来解决问题。

现在,我已切换到 CoreData 对象中保存的键值,它似乎工作得很好。

最佳答案

当调用performFetch时,我在系统堆栈的深处得到了相同的EXC_BAD_ACCESS信号。缓存或其他任何更改都没有帮助。

- (void)viewDidLoad {
[super viewDidLoad];

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
managedContext = [appDelegate managedObjectContext];

NSError *error = nil;
NSFetchedResultsController *frC = self.fetchedResultsController;
if (![frC performFetch:&error]) {
/* */
}
}

最近我发现了一个小片段要添加。实际上,问题在于我使用iOS内存管理的方式(或者没有使用过)。

- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Asiakasrekisteri" inManagedObjectContext:managedContext]; [fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:200];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"yritys" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController =
[[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedContext sectionNameKeyPath:nil cacheName:nil] retain];

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
}

aFetchedResultsController 的独立生命周期确实很短,但它在 PerformFetch 之前就被释放了。 保留确实有所帮助,结果 Controller 保持分配。

关于iphone - 为什么 NSFetchedResultsController PerformFetch : crashing when recreating an NSFetchedResultsController with an equivalent NSFetchRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com