Хобрук: Ваш путь к мастерству в программировании

Предикат Dealloc'd приводит к сбою приложения для iPhone!

Предварительно, это продолжение запроса, сделанного несколько дней назад: 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];

И теперь он не падает, но это похоже на патч, а не на то, что мне следует делать.


Ответы:


1

Вы не должны выпускать свою переменную predicate. Вы не вызывали new, alloc, retain или copy (это правило "narc") для создания предиката, поэтому вы не несете ответственности за его releasing. Вот откуда твой зомби.

08.06.2010
  • Вы должны отметить это как правильный ответ, чтобы увеличить число повторений и отметить этот вопрос как ответ. 13.06.2010
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..