0

Я продолжаю получать сообщение об ошибке «Завершение приложения из-за неперехваченного исключения» NSInvalidArgumentException », причина:« + [MainViewController minimumFormInContext:]: нераспознанный селектор, отправленный классу « » из этой строки кода: 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]; 

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

ответ

3

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

Вот вещи, которые я заметил:

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

Эти две линии очень плохо. Какой у вас mArray? Does 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! 

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

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

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

NSPredicate* predicate; 

делает не инициализации predicate быть nil. Так что возможно, что

[request setPredicate:predicate]; 

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

NSPredicate* predicate=nil; 
+0

Я сильно подозреваю, что последний - неверный селектор, указанный в качестве метода NSPredicate. Таким образом, вероятно, переменная, которую он думает указывает на NSPredicate, фактически указывает на случайную ячейку памяти. – Chuck

+0

мой mArray означает myArray. То, что я пытаюсь сделать, - создать массив объектов для использования в программе временно; есть ли лучший способ разместить данные в массиве из запроса на выборку? Я изменил предикаты до нулевого значения до их использования. –

+0

, и кажется, что установить их в nil - нет-нет, поэтому я просто установил их равными некоторому другому предикату. –

Смежные вопросы