Возникли проблемы при копировании данных в изменяемый массив - PullRequest
0 голосов
/ 05 сентября 2010

Я получаю сообщение об ошибке «Завершение приложения из-за необработанного исключения« NSInvalidArgumentException », причина:« + [MainViewController minimalFormInContext:]: нераспознанный селектор отправлен в класс » из этой строки кода: NSLog (@ "Доступ к определенным объектам шахты");

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Mine" inManagedObjectContext:managedObjectContext];   
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];   
NSError *error = nil;
[request setEntity:entity];  
NSPredicate *predicate;
NSPredicate *metalFilter;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *region = [defaults stringForKey:@"mineArray"];

if([region isEqualToString:@"Butte & Plumas"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Butte",@"Plumas"];
}
else if([region isEqualToString:@"Sutter, Yuba, & Sierra"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@) OR (county Contains %@)",@"Sutter",@"Yuba",@"Sierra"];
}
else if([region isEqualToString:@"Nevada & Placer"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Nevada",@"Placer"];
}
else if([region isEqualToString:@"Sacramento & El Dorado"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Sacramento",@"El Dorado"];
}
else if([region isEqualToString:@"San Joaquin, Amador, & Calaveras"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@) OR (county Contains%@)",@"San Joaquin",@"Amador", @"Calaveras"];
}
else if([region isEqualToString:@"Tuolumne & Stanislaus"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Tuolumne",@"Stanislaus"];
}
else if([region isEqualToString:@"Merced, Mariposa, & Madera"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@) OR (county Contains %@)",@"Merced",@"Mariposa",@"Madera"];
}

[request setPredicate:predicate];
mArray = [[NSMutableArray alloc] init];
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

используя отладчик, я сузил ошибку, возникающую в:

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

Как мне это исправить?

1 Ответ

3 голосов
/ 06 сентября 2010

Вероятно, это ошибка сохранения / выпуска. Выполните «Построить и проанализировать» в XCode и улучшите свой код, чтобы удалить все предупреждения.

Вот что я заметил:

mArray = [[NSMutableArray alloc] init];
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

Эти две строки очень плохие. Какой твой mArray? m означает member или mutable? Если это переменная-член, вы не должны просто присвоить ей новый массив, как в

// mArray points to an array at this time, say X
mArray = [[NSMutableArray alloc] init];
// at this point, mArray points to an array Y created by alloc init. X is lost! 

Более того, если вы в дальнейшем назначите mutableCopy, как вы это сделали,

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
// at this point, mArray points to an array Z created by mutableCopy. Y is lost, too!

Обратите внимание, что в Objective-C переменные, которые вы видите в исходном коде, являются просто указателем, а не самим объектом. Если вы присваиваете что-то переменной, это не заставляет объект выполнять операцию присваивания, а просто меняет указатель на что-то другое.

Тот факт, что у вас есть эти строки, предполагает, что у вас есть подобные вещи в других местах; любая из них может в конечном итоге привести к ошибке, с которой вы столкнулись. Так что вам нужно разбираться с ними один за другим. Удачи!

Еще один момент: при подготовке переменной predicate цепочка предложений if оставляет predicate неопределенным, если region не соответствует ни одному из вариантов, перечисленных вами. Это очень опасно, потому что в Objective-C строка

 NSPredicate* predicate;

не не инициализирует predicate как nil. Так что вполне возможно, что

[request setPredicate:predicate];

установит мусор в predicate из requrest. Вы должны изменить его на

 NSPredicate* predicate=nil;
...