Должен ли pushViewController освобождать oldController при нажатии нового? - PullRequest
1 голос
/ 28 апреля 2011

Из того, что я понимаю pushViewController должен выпустить старый viewController при нажатии нового?

Здесь я просто создаю два разных viewControllers и толкаю их.

    UINavigationController *navController = [[UINavigationController alloc] init];
    [self.window addSubview:navController.view];

    smallLayout = [[SmallViewController alloc] init];
    [navController pushViewController:smallLayout animated: NO];
    [smallLayout release];

    largeLayout = [[LargeViewController alloc] init];
    [navController pushViewController:largeLayout animated: NO];
    [largeLayout release];

В SmallViewController dealloc никогда не вызывается, и когда я проверяю retain count, он все еще 1. Я проверяю retain count после того, как цикл выполнения завершен, и я также знаю, что retain count не то, что вы следует доверять.

Ответы [ 3 ]

5 голосов
/ 28 апреля 2011

Нет, это не должно ....

Контроллер навигации поддерживает стек навигации всех контроллеров представления, помещенных на него ... поэтому, когда вы возвращаетесь или выдвигаете текущий контроллер представления, предыдущий контроллер все еще присутствует.

Контроллер навигации освободит контроллер вида после его нажатия.

0 голосов
/ 28 апреля 2011

Вы выделяете один раз, вы отпускаете один раз. Вы уже делаете это в своем коде. Так что AFAIK ваш код в порядке. Здесь dealloc smallLayout вызываться не будет, потому что UINavigationController хранит в себе стек всех viewControllers, поэтому сохраняет его. UINavigationController управляет выпуском этих viewControllers, когда он больше не нужен.

0 голосов
/ 28 апреля 2011

Контроллеры вида не освобождаются, когда вы помещаете новый контроллер в стек навигации. Контроллер навигации продолжает удерживать их, чтобы у него был правильный элемент, отображаемый при извлечении из него текущего контроллера. Если бы он выпускал его, то навигационному контроллеру было бы нечего возвращаться.

Если вы хотите оптимизировать память, используйте - (void) viewDidUnload. Он вызывается, когда когда-либо загружается представление контроллера, что может произойти, когда вы нажимаете новый контроллер. Я говорю, что это может произойти, поскольку он вызывается в условиях нехватки памяти. Так что, если у вас много свободной памяти, она не будет вызвана. В симуляторе вы можете форсировать его, имитируя предупреждение памяти. Убедитесь, что все, что вы уничтожаете в нем, может быть воссоздано в -viewDidLoad.

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