iPad SearchViewController 崩溃 _PFArray objectAtIndex 超出范围

iPad SearchViewController crash _PFArray objectAtIndex beyond bounds

我正在处理我的应用程序的 iPad 版本,但我遇到了一个奇怪的问题。

这是应用程序的结构:

UISplitViewController
->MasterViewController
-->NavigationController
--->TableViewController
---->PrototypeCells
--->SearchDisplayController
->DetailViewController
-->NavigationController
--->TableViewController
---->StaticCells

基本上,应用程序在 MasterView 上使用 CoreData 和 fetchResultController 显示大约 40 000 行。用户可以使用 searchDisplayController 搜索项目或使用新的 FetchResultController 对 TableView 进行排序。单击一行时,didSelectRowAtIndexPath 方法在 detailView 中设置 Item。

问题是有时当我点击 searchBar 时,应用程序崩溃并显示以下错误消息:

**Terminating app due to uncaught exception 'NSRangeException', 
reason: ' -[_PFArray objectAtIndex:]: index (11) beyond bounds (X)'**

但我想我发现了一个导致应用程序每次都崩溃的场景:

  1. 应用程序负载
  2. 我搜索一个包含 5 或 6 个字母的 searchString,所以 searchViewController 返回的项目非常小(比如 5 项目)。我认为 "beyond bounds (X)" 对应这个数量的项目。
  3. 我取消搜索
  4. 我用新的 FetchResultController 对 tableView 进行排序
  5. 我在搜索栏上输入,应用程序立即崩溃

如果我执行相同的场景,但使用包含 2 个或 3 个字母的 searchString,则 searchViewController 返回的项目数量更大,则不会发生崩溃。

另外,我应用这个场景的时候iPhone版本没有problem/crash

我不明白问题出在哪里,快把我逼疯了。有人知道出了什么问题吗?我可以更新此 post 以添加代码,但目前,我不知道哪一部分对理解崩溃有用。

感谢阅读。

所以我想我找到了解决办法。

在我的 TableViewController 中设置断点后,我注意到在搜索栏上点击时崩溃的方法是 cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ItemCell *cell = [self.tableView dequeueReusableCellWithIdentifier:ItemCellIdentifier forIndexPath:indexPath];
    Item *item = nil;
    if (self.searchDisplayController.active) {
        item = [self.filteredList objectAtIndex:indexPath.row];
    } else {
        item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    }
    //...
    return cell;
}

特别是这一行:item = [self.filteredList objectAtIndex:indexPath.row];

当用户停止使用此方法进行搜索并且不再崩溃时,我尝试清空 filteredList:

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.filteredList=nil;
}