Циклы в NavigationController - как избежать утечек памяти? - PullRequest
0 голосов
/ 05 февраля 2019

В моем приложении у меня есть навигационный контроллер с четырьмя контроллерами.Пользователь перемещается от A -> B -> C -> D -> A_1 -> B_2 -> ... и т. Д. Это один путь, и каждый ViewController всегда является новым ViewController.

Этот цикл предназначен.Но в ViewController A и C я инициализирую GoogleMaps, который использует много памяти.Итак, после 15 циклов (и 30 дюймов GoogleMaps) мое приложение вылетает из-за утечки памяти.

Теперь я вижу разные возможности для решения этой проблемы.

1) Я не инициирую новый ViewController, скорее, я снова использую свои VC.Так что Google Maps просто инициализирую два раза. Мне это не нравится, потому что у моих ВК могут быть разные состояния.Чистая инициализация была бы более удобной и меньший источник ошибок

2) Я удаляю стек в нужное время, потому что навигация - только один путь.Когда переход из A -> B будет выполнен, я могу выбросить А.То же самое для C -> D.

3) Я перехожу из Google Maps после переходов.Я пока не знаю, как это сделать, но я вполне уверен, что пойму это.

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

Какая лучшая практика?Что рекомендует Apple?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы упомянули, что навигация - это только один способ.Если это так, вы можете просто заменить массив UINavigationController viewControllers.Другими словами, вам может не понадобиться навигационный стек, если пользователь не идет назад в стеке.

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

0 голосов
/ 06 февраля 2019

Вы можете перемещаться по контроллерам вида из A -> B -> C -> D -> A_1 -> B_2 -> ... и т. Д., Используя два метода.

Метод 1: Когда вы переходите к контроллеру D, затем переходите к определенному контроллеру (контроллеру A) и снова перемещайтесь по циклу от A до D с помощью контроллера push-просмотра.

self.navigationController?.popToViewController(A, animated: true)

Метод 2: Когдазатем вы переходите к D-контроллеру, затем к существующему контроллеру (A-контроллеру) и отклоняете представленный поток циклов, когда вы снова достигли D-контроллера

viewController.present(A, animated:true, completion: nil)
0 голосов
/ 05 февраля 2019

Начните с 3-го и самого простого варианта:

Используйте override func viewWillDisappear(){} для определения Google Maps.Вы можете использовать этот метод и для второго варианта.

Но я думаю, вам следует использовать делегатов, когда вы возвращаетесь к A из D. Что вы меняете на A, когда достигаете его снова?

...