Держите память в чистоте и убивайте ViewControllers - PullRequest
0 голосов
/ 19 декабря 2018

Я заметил, что по мере навигации по моему стеку приложений iOS растет с каждым открытым viewController.

Моя навигация основана на переходах, и перед каждым переходом я делаю self.dismiss().Тем не менее, это выглядит как стек viewControllers в памяти.

Как мне этого избежать?

В Android finish() убивает Activity (в большинстве случаев), поэтому мне нужна альтернатива в iO.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Проблема с памятью может иметь несколько причин и не обязательно UIViewController.Чтобы найти и решить проблему, вы должны уменьшить масштаб проблемы с «приложения» до определенного экрана или даже класса.Затем вы можете проверить код и попытаться выяснить, где находится подозрительный код.

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

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

Перейдите через приложение «до конца», затем вернитесь к «домашнему экрану», если память падает, все хорошо.

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

Теперь мы вернулись к «увеличению памяти снова почти так же, как в первый раз», теперь я делаю пробный прогон и беру каждый экран за разЯ просто открываю экран, возвращаюсь (отклоняю / выскакиваю контроллер) и наблюдаю, если память падает, то это не экран, который протекает.Когда я нахожу экран, который увеличивает память и никогда не возвращается назад:

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

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

0 голосов
/ 19 декабря 2018

За документацию на UIViewController.dismiss:

Отклоняет контроллер представления, который был представлен модально контроллером представления.

Итак, вызов этогоотклонил бы любой контроллер представления, показанный модально.Исходя из вашего вопроса, я должен предположить, что ваши сегменты являются push-segues, а не модальными, иначе вы бы увидели, что ваши контроллеры представления исчезают.

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

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

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