Я потратил несколько часов, пытаясь выяснить эту проблему, и я думаю, что это сводится к моему фундаментальному пониманию Цели С, хотя это проявилось в работе с Базовыми данными. Я не удивлен - я работаю с Objective C и Cocoa Touch всего два месяца.
Моя ситуация такова, что у меня есть серия моделей, которые все отлично подключены на CD. Мое приложение работает отлично, пока я не попытался расширить его вчера. У меня есть моя основная модель Job в контроллере представления как свойство класса в файле .h. В моем методе viewWillAppear мне нужно искать отношения через другой объект, поэтому я делаю что-то вроде:
/** project as an ivar **/
NSManagedObject *project = [job valueForKey:@"project"];
NSArray *divisions = [[project valueForKey:@"divisions"] allObjects];
//do something with divisions --> crash
...
/** project as a property **/
project = [job valueForKey:@"project"];
NSArray *divisions = [[project valueForKey:@"divisions"] allObjects];
//do someting, anything ---> A-OK!
Итак, почему мое приложение вылетает, когда я пытаюсь что-то сделать с результатами [project valueForKey:], если я не делаю проект свойством класса?
EDIT
Похоже, что если просто включить в него условное выражение if(!divisions)
(которое должно быть равно нулю при первой загрузке представления), ему не нравятся приведенные выше операторы и выдается EXC_BAD_ACCESS
. Однако, если оставить его, мой код работает нормально.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(!divisions){
NSManagedObject *project = [[job valueForKey:@"project"] retain];
NSArray *divs = [[project valueForKey:@"divisions"] allObjects];
NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
divisions = [[divs sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]] mutableCopy];
}
[[self tableView] reloadData];
}
Я согласен с тем, что происходит более серьезная проблема с управлением памятью. Должен ли я вернуться и перечитать некоторые главы книги об Obj-C и пересмотреть мои переменные, чтобы это имело смысл?