У меня есть приложение, в которое я импортирую кучу данных, и я хочу, чтобы это происходило в фоновом потоке. Это работало хорошо для небольшого количества данных, но теперь кажется, что я сталкиваюсь с этой ошибкой на полпути при анализе и импорте больших объемов моих данных в Core Data:
Program received signal: “EXC_BAD_ACCESS”.
Вот вызов фоновой темы:
[self performSelectorInBackground:@selector(importAllData) withObject:nil];
Вот пример того, что я делаю в своем коде:
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// load manufactuers from DB
NSFetchRequest *crequest = [[NSFetchRequest alloc] init];
NSEntityDescription *manufacturer = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext];
[crequest setEntity:manufacturer];
NSError *cerror=nil;;
NSArray *manufacturers = [[managedObjectContext executeFetchRequest:crequest error:&cerror]mutableCopy];
[crequest release];
for (int m=0; m < [manufacturers count]; m++) {
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:kClientListURL, [[manufacturers objectAtIndex:m]ManufacturerID]]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setNumberOfTimesToRetryOnTimeout:2];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *responseString = [request responseString];
NSArray *items = [responseString JSONValue];
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
NSNumberFormatter *dec = [[NSNumberFormatter alloc]init];
[dec setNumberStyle:NSNumberFormatterDecimalStyle];
for (int i = 0; i < [items count]; i++)
{
Client *entity = (Client*) [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:managedObjectContext];
[entity setCompanyName:[[items objectAtIndex:i] objectForKey:@"CompanyName"]];
// set a bunch of other properties
[entity setManufacturer:[manufacturers objectAtIndex:m]];
statusMessage = [NSString stringWithFormat:@"importing client: %@", entity.CompanyName];
[self performSelectorOnMainThread:@selector(setStatus) withObject:nil waitUntilDone:YES];
}
[f release];
[dec release];
} else {
NSLog(@"%@",[NSString stringWithFormat:@"JSON parsing failed: %@", [error localizedDescription]]);
}
NSError *entityerror;
if (![managedObjectContext save:&entityerror]) {
// //Handle the error.
NSLog(@"\n\n\n Error saving clients: %@ \n\n\n\n",entityerror);
}
}
//More data importing code
[pool release];
Как я уже сказал, это работало нормально для небольшого количества данных, но теперь в симуляторе он выдает ошибочные ошибки доступа в случайных точках.
Тогда я прочитал эту статью, которая смутила меня:
http://www.cocoadev.com/index.pl?DebuggingAutorelease
Мне не нужно освобождать мои объекты, если они находятся внутри NSAutoReleasePool? Я заставляю их быть выпущенными дважды в некоторый момент?
Если я удаляю операторы release, я получаю потенциальные ошибки утечек при сборке с использованием Command-Shift-A?