Это обновление к моей проблеме. Я получаю это предупреждение сейчас, когда программа прерывается.
предупреждение: попытка создать переменную USE_BLOCK_IN_FRAME с блоком, который не находится в кадре.
Я не могу найти много информации о том, что это значит.
Это меня озадачило. Я получаю ошибку EXC_BAD_ACCESS. У меня есть NSZombieEneabled (который помог с более ранней проблемой), но нет стека вызовов для отслеживания.
У меня есть почти идентичный код, который работает по отношению к другому извлеченному контроллеру результатов.
Кажется, это как-то связано с отношениями между объектом задания и связанным с ним объектом клиента. Это отношение [объект задания] << -> [объект клиента].
Изначально я вижу, что код работает без ошибок, когда объект задания, соответствующий выбранной строке, не имеет объекта клиента, связанного через отношение. Таким образом, в случае сбоя это указывает на клиентскую сущность, но если это не так, указатель равен нулю.
Когда я сталкиваюсь с этой проблемой, я запускаю приложение и перехожу непосредственно к представлению выбора работы и выбираю ячейку. Именно в этот момент возникает проблема.
Я провел эксперимент, запустив приложение и сначала перейдя к представлению выбора клиента, зная, что выборка будет происходить из всех клиентских объектов. Затем я пошел к представлению выбора работы и выбрал ячейку. Проблема не возникла.
Поскольку я просто пытаюсь передать указатель на объект задания, который уже был получен, я не понимаю, что происходит.
Кстати, код работал нормально, прежде чем я переключился на использование NSFetchedResultsControllers. Мне нравится то, что они могут сделать для меня, но здесь происходит некоторая динамика, которую я не понял.
Регистрация не показывает мне ничего, что я понимаю, в отношении решения проблемы.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"\n\n(1 Pick) indexPath: %@\n",indexPath);
NSLog(@"\n\n(1 Pick) userState: %@\n",userState);
NSLog(@"\n\nnumber of Objects in job fetchresultscontroller = %d", [[fetchedResultsController fetchedObjects] count] );
NSLog(@"\n\n(1 Pick) selected job: %@\n",[self.fetchedResultsController objectAtIndexPath:indexPath]); // This line is causing the problem...
NSLog(@"\n\n(1 Pick) selected job: %@\n",userState.selectedJob); // Omitting the line above, this line fails
[self.navigationController pushViewController:userState.jobInfoTVC animated:YES];
}
Вывод отладки:
2011-05-07 09:27:04.142 job1[6069:207]
(1 Pick) indexPath: <NSIndexPath 0x5952590> 2 indexes [0, 3]
2011-05-07 09:27:04.142 job1[6069:207]
(1 Pick) userState: <UserStateObject: 0x5919970>
2011-05-07 09:27:04.143 job1[6069:207]
number of Objects in job fetchresultscontroller = 4
(gdb)
Окончательный код должен быть таким простым, что привело меня ко всем журналам:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath]; // Original failure was at this line
[self.navigationController pushViewController:userState.jobInfoTVC animated:YES];
}
Я использую singleton userState, чтобы отслеживать, что сделал пользователь. Так что я сохраняю там указатели на объекты selectedJob и selectedClient. Это работало хорошо, прежде чем я переключился на NSFetchedResultsController.