Я понял, что это было - заняло у меня некоторое время, но я снова посмотрел на пример, который я только что связал. Я обновлял iVar self.matchingObjects в фоновом потоке, что в некоторых случаях вызывало несоответствие между диапазоном массива, доступного в основном потоке, и фоновым потоком. Так, например, переменная, возможно, была обновлена в фоновом потоке, и основной поток все еще может получать доступ к той части диапазона, которая больше не существует в переменной с момента ее обновления.
Исправлено, изменив мой код следующим образом:
[self.searchQueue addOperationWithBlock:^
{
NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
[request release];
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
self.matchingObjects = results;
[self.searchDisplayController.searchResultsTableView reloadData];
}];
}];
Теперь результаты поиска загружаются во временный удерживающий массив с именем «results», и сначала в главном потоке обновляется matchObjects iVar, а затем перезапускается tableView. Таким образом, tableView всегда ссылается на массив, который никогда не изменяется при обращении к нему, поскольку tableView полагается на matchObjects для получения количества строк и данных.