При тестировании моего приложения с помощью 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