Базовые данные: ошибка неверного доступа при выполнении выборки - PullRequest
0 голосов
/ 31 марта 2011

В коммите UITableView я удаляю объект, используя следующий код:

[_context deleteObject:[_StudiessList objectAtIndex:indexPath.row]];
NSError *error; 
if (![_context save:&error]) {
    // Handle error
    NSLog(@"Unresolved error series %@, %@", error, [error userInfo]);
}
 [self LoadData]; // bad access fire here

, где LoadData - это функция для пополнения представления таблицы

Его код:

iPaxeraAppDelegate *appDelegate = (iPaxeraAppDelegate *)[[UIApplication sharedApplication] delegate];
self.context = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Studies" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]]; 
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error;
@try {  
    // error done here exactly at fetch 
    self.StudiessList = [_context executeFetchRequest:fetchRequest error:&error];  
}
@catch (NSException * e) {
    NSLog(e);
}
[fetchRequest release];
[StudiessList retain];

LoadData падает при executeFetchRequest:

1 Ответ

0 голосов
/ 31 марта 2011

Ваша проблема, вероятно, здесь:

NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]]; 

Прикрепляя явное автоматическое освобождение, вы устанавливаете обстоятельства, при которых дескриптор сортировки может быть освобожден, пока он все еще необходим. Когда выборка идет, чтобы захватить дескриптор сортировки, она падает, потому что объекта там нет.

Явные авто-релизы могут быть проблематичными, потому что они тесно связаны с опустошением пула памяти той непосредственной области, в которой они определены. Хотя многие люди используют авто-релиз случайно, вам действительно следует использовать его, только когда вы возвращаете значение из метод, потому что autorelease сообщает среде выполнения: «Я полностью закончил работу с этим объектом, и мне все равно, что с ним будет». Если вы не закончили с объектом, то у вас будут проблемы.

Использование неявного автоматического выпуска из удобного метода устраняет эту проблему, потому что автоматический выпуск выпускается в другом объеме, например объект класса, содержащий удобный метод. Затем он входит в локальную область и может быть сохранен, не беспокоясь об автоматическом выпуске в локальной области, убившем его.

Попробуйте:

NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"StudyDate " ascending:YES]];

... и посмотрите, разрешит ли это аварию.

...