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)'**
但我想我发现了一个导致应用程序每次都崩溃的场景:
- 应用程序负载
- 我搜索一个包含 5 或 6 个字母的 searchString,所以
searchViewController 返回的项目非常小(比如 5
项目)。我认为 "beyond bounds (X)" 对应这个数量的项目。
- 我取消搜索
- 我用新的 FetchResultController 对 tableView 进行排序
- 我在搜索栏上输入,应用程序立即崩溃
如果我执行相同的场景,但使用包含 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;
}
我正在处理我的应用程序的 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)'**
但我想我发现了一个导致应用程序每次都崩溃的场景:
- 应用程序负载
- 我搜索一个包含 5 或 6 个字母的 searchString,所以 searchViewController 返回的项目非常小(比如 5 项目)。我认为 "beyond bounds (X)" 对应这个数量的项目。
- 我取消搜索
- 我用新的 FetchResultController 对 tableView 进行排序
- 我在搜索栏上输入,应用程序立即崩溃
如果我执行相同的场景,但使用包含 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;
}