Предварительно, это продолжение запроса, сделанного несколько дней назад: https://stackoverflow.com/questions/2981803/iphone-app-crashes-when-merging-managed-object-contexts
Краткая версия: EXC_BAD_ACCESS приводит к сбою моего приложения, и режим зомби показал, что виновником является мой предикат, встроенный в запрос на выборку, встроенный в мой контроллер извлеченных результатов. Как объект внутри объекта освобождается без явной команды для этого?
Длинная версия: Контроллер представления платформ структуры приложения -> Контроллер представления игр (в зависимости от выбора платформы) -> Добавить контроллер представления игры
Когда строка щелкается в представлении «Платформы», она устанавливает переменную экземпляра в представлении «Игры» для этой платформы, затем Контроллер результатов выборки игр создает запрос на выборку обычным способом:
- (NSFetchedResultsController *)fetchedResultsController{
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
//build the fetch request for Games
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Game"
inManagedObjectContext:context];
[request setEntity:entity];
//predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"platform == %@",
selectedPlatform];
[request setPredicate:predicate];
//sort based on name
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
//fetch and build fetched results controller
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[sortDescriptor release];
[sortDescriptors release];
[predicate release];
[request release];
[aFetchedResultsController release];
return fetchedResultsController;
}
В конце этого метода элемент _fetch_request -> _predicate элемента fetchedResultsController устанавливается в объект NSComparisonPredicate. Все хорошо в мире.
К моменту вызова секции (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) _predicate теперь является Zombie, что в конечном итоге приведет к сбою приложения, когда таблица попытается обновить себя.
Я более-менее запутался. Я не выпускаю полученный контроллер результатов или любую из его частей, и единственная часть, которая освобождается, - это предикат. Любые идеи?
РЕДАКТИРОВАТЬ: В качестве теста я добавил эту строку в метод Fetched Results Controller:
[fetchedResultsController.fetchRequest.predicate retain];
И теперь он не падает, но это похоже на патч, а не на то, что мне следует делать.