Возникли проблемы с копированием данных в изменяемый массив

Я продолжаю получать сообщение об ошибке «Завершение работы приложения из-за необработанного исключения« 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];

Как я могу это исправить?


person kevin Mendoza    schedule 05.09.2010    source источник


Ответы (1)


Вероятно, это ошибка сохранения/релиза. Выполните «Создание и анализ» в 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;
person Yuji    schedule 05.09.2010
comment
Я сильно подозреваю, что последнее — указанный недопустимый селектор является методом NSPredicate. Так что, вероятно, переменная, которая, по его мнению, указывает на NSPredicate, на самом деле указывает на случайное место в памяти. - person Chuck; 06.09.2010
comment
мой mArray означает мой массив. Я пытаюсь создать массив сущностей для временного использования в программе; есть ли лучший способ поместить данные в массив из запроса на выборку? Я отредактировал предикаты, приравняв их к нулю, прежде чем они будут использоваться. - person kevin Mendoza; 06.09.2010
comment
и кажется, что устанавливать их равными нулю - нет-нет, поэтому я просто устанавливаю их равными какому-то другому предикату. - person kevin Mendoza; 06.09.2010
comment
Что ж, установка на nil в целом хорошая вещь; Я думаю, NSFetchRequest не нравится предикат nil. Я не вижу никаких проблем с вашим общим подходом. Это просто уничтожение жуков. - person Yuji; 06.09.2010
comment
ну, я смог исправить это благодаря вашей помощи в объявлении массива. - person kevin Mendoza; 06.09.2010