Вероятно, это ошибка сохранения / выпуска. Выполните «Построить и проанализировать» в 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;