YellowCataclysm
@YellowCataclysm
Личинка программиста

Как правильно инстанцировать и хранить ViewController-ы в iOS?

Инстанцирование ViewController-ов из storyboard осуществляется методом instantiateViewControllerWithIdentifier, после чего созданный VC инициализируют и "показывают".
Считается ли нормальной практикой хранить полученную strong-ссылку на VC в вызывающем классе, чтобы создаваемый VC не деаллоцировался сразу после его закрытия и его можно было отображать по необходимости, минуя стадию создания и инициализации? Или же правильным решением будет отпускать ссылку и при каждом обращении инстанцировать VC заново?
  • Вопрос задан
  • 240 просмотров
Решения вопроса 1
@freeg0r
.. some dude ..
Не считается. Создание контроллера не такая уж затратная операция, а данные, которые ему необходимы, Вы конечно можете хранить. В противном случае есть опасность утечек. В вызывающем классе (или в NavigationController) есть системная ссылка на представленный контроллер, которая обнуляется конечно при удалении его с экрана.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ManWithBear
@ManWithBear
Swift Adept, Prague
В более идеальном мире у вас для каждого контроллера будет свой xib, в котором будет собственно и происходить layout. Такой подход отлично решает проблему мержей сторибордов.
В итоге мы отказываемся от стринговых констант (viewControllerID). И тогда создание нового контроллера будет выглядеть вот так:
let vc = MyViewController()
Этот подход в свою очередь подталкивает нас к Dependency Injection.
В итоге получаем удобное:
let vc = MyViewController(dependency1: Dependency1, dependency2: Dependency2, ...)

Но если зависимостей больше 2-3, то их удобнее выводить в отдельный settings-класс/структуру:
let settings = MyViewController.Settings(<here init>)
let vc = MyViewController(with: settings)

В итоге смысла держать любую ссылку на контроллер нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы