Можно ли вручную выводить контроллеры представления, которые в данный момент не видны (приложение на другой вкладке) в предупреждении о памяти? - PullRequest
0 голосов
/ 05 июля 2011

У меня "управление памятью по сравнению с пользовательским опытом" или просто глупый вопрос.Давайте представим приложение на основе UITabBarController с двумя вкладками.Пока пользователь находится на 1-й вкладке, в память поступает предупреждение, а контроллер представления 2-й вкладки обрабатывает didReceiveMemoryWarning.Предположим также, что на 2-й вкладке есть контроллер push-представления.Вопросы:

  1. Можно ли вручную вставлять ВК во 2-ю вкладку с popViewControllerAnimated: при выдаче предупреждения о памяти?
  2. Считается ли это плохим UX или плохой идеей mem-mgmt?Я думаю, что пользователь может быть удивлен тем, что он / она увидит после переключения на 2-ю вкладку, но если я не открою этот ВК, пользователь увидит просто пустой экран.Если пользователь нажмет «Назад», вторая вкладка VC все равно перезагрузится (перезапустите жизненный цикл с viewDidLoad:, и это лучше, чем приложение, которое будет убито iOS).

Единственный недостаток, который я вижу вВышеупомянутый подход, когда мой толкнул VC также подтолкнул некоторые VC.Тогда код усложнил бы ... и если бы было что-то еще, это усложнило бы дальнейшее, оставив мне трудно поддерживать код спагетти, подобный этому:

- (void)didReceiveMemoryWarning {
    UIViewController *pushedController = [self.navigationController visibleViewController];
    if ([pushedController isKindOfClass:[MyController class]]) {            
        // POP
        [self.navigationController popViewControllerAnimated:NO];
    } else {
        // MyController pushed something
        UIViewController *innerController = [pushedController.navigationController visibleViewController];
        if ([innerController isKindOfClass:[MyOtherController class]]) {
            [innerController.navigationController popViewControllerAnimated:NO];
            // Final POP
            [self.navigationController popViewControllerAnimated:NO];
        }
    }

    [super didReceiveMemoryWarning];
}

Какой ваш подход / совет?Может быть, уже есть простой подход к этому, и я упустил это из виду?

1 Ответ

2 голосов
/ 05 июля 2011

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

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

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