Если я освобождаю, я получаю плохой доступ, если я сохраняю, я пропускаю - PullRequest
4 голосов
/ 15 мая 2011

У меня есть контроллер представления, который я пытаюсь вставить в стек навигации.Я создаю контроллер с локальной переменной, устанавливаю его, а затем назначаю его свойству.Затем, если я освобождаю переменную, я получаю EXE_BAD_ACCESS.если я сохраняю (или автоматически освобождаю), он протекает.

CustomTVC* controller = [[CustomTVC alloc]initWithStyle:UITableViewStyleGrouped];
controller.managedObjectContext = self.managedObjectContext;

self.tableViewControllerIvar = controller;

[self.navigationController pushViewController:self.tableViewControllerIvar animated:YES];
 //[controller autorelease]; or [controller release]; or nothing

Вот именно то, что происходит, если я отпускаю

  1. Приведенный выше код запускается нажатием кнопки добавления в навигационной панели.bar.
  2. вид выдвигается и все нормально.В новом представлении я могу вставлять больше представлений снова и снова без проблем ... если только
  3. Я возвращаюсь к корневому представлению стека навигации.(Отсюда и вышеприведенный код).
  4. Теперь, если я снова развернусь до второго представления, то попытаюсь выдвинуть другое, оно вылетает.

Редактировать: У меня такое ощущение, что что-то идет не так, когда я помещаю третий контроллер в стек.При нажатии он вставляет новый объект в контекст управляемого объекта, что заставляет контроллер fetchedresults обновлять представление таблицы.Там может быть где-то сломанный указатель.Я поиграюсь с ним и выложу результаты.-

Редактировать: 5/16

Получение этого сообщения об ошибке в журнале

* - [CustomTVCcontrollerWillChangeContent:]: сообщение отправлено на освобожденный экземпляр 0x187270

Это происходит только после того, как я вытолкну CustomTVC из стека (вернусь к контроллеру корневого представления навигации). Я могу нажать и сохранить все, что хочу, до тех пор, покакак я не выскакиваю CustomTVC.

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Исправлено. Пришлось установить делегат полученных результатов контроллеров в ноль в viewDidLoad.

- (void)dealloc
{
    self.fetchedResultsController.delegate = nil;
    [_fetchedResultsController release];
    [_managedObjectContext release];
    [super dealloc];
}

, кажется, виновник был (согласно инструментам зомби):

[NSFetchedResultsController (закрытые методы) _managedObjectContextDidChange:]

Edit (s): Наконец-то нашли время, чтобы выяснить, как правильно разместить код здесь (я ленивый)

0 голосов
/ 15 мая 2011

вы назначаете контроллер для tableViewControllerIvar

 self.tableViewControllerIvar = controller;

, и вы освобождаете контроллер, поэтому вам нужно сохранить его в строке выше

 self.tableViewControllerIvar = [controller retain];

и когда вы закончите"tableViewControllerIvar", затем просто отпустите его, после этого вы не получите никаких утечек

0 голосов
/ 15 мая 2011

autorelease должен получить работу. Когда вы назначаете tableViewControllerIvar, вы можете просто позвонить [controller autorelease]. Это должно позаботиться об этом.

CustomTVC* controller = [[CustomTVC alloc]initWithStyle:UITableViewStyleGrouped];
controller.managedObjectContext = self.managedObjectContext;

self.tableViewControllerIvar = [controller autorelease];

[self.navigationController pushViewController:self.VCTVC animated:YES];

Если вы все еще получаете EXE_BAD_ACCESS, то должно произойти что-то еще. Вы абсолютно подтвердили, что этот код при многократном запуске вызывает неправильный доступ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...