Что делает кнопка «Назад» в контроллере навигации, чего нет у pushViewController? - PullRequest
0 голосов
/ 10 февраля 2012

При тестировании моего приложения с помощью Instruments -> Activity Monitor, я вижу разницу в использовании памяти, когда переход выполняется с помощью кнопки назад и следует за контроллером навигации по сравнению с вызовом метода в AppDelegate, который использует pushViewController. Если навигация завершается с помощью кнопки «Назад», то использование памяти падает (я новичок в программировании на iOS, но я считаю, что термин - это освобождение подпредставлений этого конкретного контроллера). Если я отойду от этого контроллера представления с помощью метода в AppDelegate, который использует pushViewController, то память не освобождается, и если вы вернетесь к этому контроллеру представления, он начнет снова складываться. Я работаю в XCode 4.2, пишу для iOS5.

Это метод в AppDelegate:

-(void)applicationDidTimeout:(NSNotification *) notif
{
    UIViewController *controller = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"slideShow"];

    [[UIScreen mainScreen] setBrightness:0.0];
        NSLog(@"go home");
        [(UINavigationController *)self.window.rootViewController pushViewController:controller animated:YES];
}

Приложение выглядит так: Главная страница с 4 кнопками. Кнопка 1 выдвигает UIViewController с прокруткой, у которой есть подпредставление (A). Это подпредставление также имеет подпредставление (B) с кнопкой закрытия. Нажмите кнопку закрытия, и подпредставление (B) будет удалено из суперпредставления. Нажмите кнопку «Назад» в левом верхнем углу, и она вернется на главную страницу. Если у вас нет взаимодействия с пользователем по истечении заданного периода времени, приведенный выше метод срабатывает и отправляет вас на screenSaverViewController. Нажмите в любом месте заставки, и вы вернетесь на главную страницу.

При просмотре монитора активности объем памяти, сообщаемый как используемый в окне реального использования памяти, увеличивается каждый раз, когда появляется подпредставление (B), но не уменьшается, пока вы не нажмете кнопку «Назад» и не вернетесь на главную страницу. , Если включается экранная заставка, она вообще не отключается.

При использовании любого из методов viewWillDisappear и viewDidDisappear оба запускаются в контроллере прокрутки. Почему один освобождает память, а другой нет?

Все мои навигации работают, это просто проблема использования памяти, с которой мне нужна помощь.

Продолжение:

picciano указал на то, чего я не видел - pushViewController делает то, что делает. Выдвигает представления поверх существующих представлений. Кто-нибудь может предложить правильную замену pushViewController? Метод должен запускаться из AppDelegate, чтобы при переходе уведомления приложение переходило из любого представления в экранную заставку.

Решено:

В итоге я переместил навигацию из AppDelegate на отдельные контроллеры представления. Я удостоверился в #import "Timer.h" и добавил слушателя уведомлений к viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];, а затем добавил метод applicationDidTimeout::

-(void)applicationDidTimeout:(NSNotification *) notif
{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
}

1, в данном случае, мой контроллер заставки. 0 = корневой вид. Эти числа следуют за стеком навигации. root view (0) -> screen saver (1) -> main page (2) -> 1 of 4 other pages

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

pushViewController (как следует из названия) добавляет новый экземпляр UIViewController в контроллер навигации, увеличивая общее использование памяти.

Кнопка «назад», напротив, удаляет верхний UIViewController из контроллера навигации и освобождает память.

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

Переосмыслите навигацию.

0 голосов
/ 10 февраля 2012

Еще одно потенциальное решение - взглянуть на некоторые методы UIView для добавления, удаления или обмена подпредставлениями.

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

...