Вопрос проверяет практическое знание ARC и правильного управления ссылками в архитектуре VIPER.
Проблема retain cycle решается использованием слабой ссылки (weak) со стороны Presenter на View. View продолжает хранить Presenter сильной ссылкой. Такая схема разрывает цикл владения. В результате оба объекта корректно освобождаются. Это стандартная практика в VIPER.
Решение проблемы retain cycle основано на правильном распределении владения.
В паре View–Presenter:
View владеет Presenter
Presenter не должен владеть View
View:
class UserViewController: UIViewController {
var presenter: UserPresenter!
}
Presenter:
class UserPresenter {
weak var view: UserViewInput?
}
View:
является частью UI
управляется UIKit
имеет чёткий жизненный цикл
Presenter:
обслуживает View
не должен продлевать её жизнь
Иногда используется unowned, но:
это опаснее
может привести к крэшу
подходит только при гарантированном жизненном цикле
замыкания в Presenter
асинхронные коллбеки
ссылки на Router и Interactor
Использование weak ссылки на View со стороны Presenter — обязательное правило VIPER. Без этого архитектура быстро приводит к утечкам памяти.