Ваша проблема, вероятно, здесь:
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]];
Прикрепляя явное автоматическое освобождение, вы устанавливаете обстоятельства, при которых дескриптор сортировки может быть освобожден, пока он все еще необходим. Когда выборка идет, чтобы захватить дескриптор сортировки, она падает, потому что объекта там нет.
Явные авто-релизы могут быть проблематичными, потому что они тесно связаны с опустошением пула памяти той непосредственной области, в которой они определены. Хотя многие люди используют авто-релиз случайно, вам действительно следует использовать его, только когда вы возвращаете значение из метод, потому что autorelease сообщает среде выполнения: «Я полностью закончил работу с этим объектом, и мне все равно, что с ним будет». Если вы не закончили с объектом, то у вас будут проблемы.
Использование неявного автоматического выпуска из удобного метода устраняет эту проблему, потому что автоматический выпуск выпускается в другом объеме, например объект класса, содержащий удобный метод. Затем он входит в локальную область и может быть сохранен, не беспокоясь об автоматическом выпуске в локальной области, убившем его.
Попробуйте:
NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"StudyDate " ascending:YES]];
... и посмотрите, разрешит ли это аварию.