навигационный контроллер popToRootViewController и viewWillDisappear - PullRequest
1 голос
/ 06 июля 2011

У меня есть простая навигационная иерархия:

Controller 1 > Controller 2 > Controller 3

Каждый контроллер содержит ссылку (@property (nonatomic, assign) ...) на свой дочерний и родительский элемент.

Мой viewWillDisappear выглядит примерно так:

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);

    if (![self.navigationController.viewControllers containsObject:self]) {
        // View has been popped! Important to distinguish between view popping and tab switching.
        // If parent view controller is active, pass a message.
        if (_refParentViewController && !_isSearchViewController) {
            _refParentViewController.valueX = @"xyz";
        }
    }

    [super viewWillDisappear:animated];
}

Теперь есть случай, когда выполняется следующая инструкция (Контроллером 1):

[self.navigationController popToRootViewControllerAnimated:NO];

В результате я получаю сбой, потому что _refParentViewController является освобожденным экземпляром (на этом этапе).Как я могу проверить, действительно ли _refParentViewController?Я думал, что контроллеры / представления вида будут уничтожены по порядку, но похоже, что никакого определенного порядка нет, и Контроллер 2 уничтожается до Контроллера 3.

Я могу проверить retainCount, но я неконечно, если это хорошая идея

1 Ответ

3 голосов
/ 06 июля 2011

Я могу проверить retainCount, но я не конечно, если это хорошая идея.

Это ужасная идея; retainCount бесполезен, не называйте это. И обратите внимание, что retainCount может никогда вернуть 0; его нельзя использовать, чтобы узнать, освобожден ли объект или нет.

Если ваши родительские и дочерние свойства равны assign, то кто отвечает за сохранение контроллера представления? Вам нужен retain, который охватывает ожидаемый срок службы родительских / дочерних свойств.

Я бы посоветовал вам сделать свойство child retain и оставить родительское свойство как assign. Вам также необходимо убедиться, что при установке child на nil (что со свойством retain будет release it , пока вы проходите через установщик свойства ), что вы сначала установите для свойства parent ребенка значение nil.

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