Вопрос проверяет понимание управления памятью в iOS и особенностей связей между компонентами VIPER.
Циклическая ссылка в VIPER возникает из-за взаимных сильных ссылок между объектами. Чаще всего это происходит между View и Presenter. View хранит Presenter, а Presenter — View. Если обе ссылки сильные, объекты не освобождаются из памяти. Это приводит к утечкам памяти.
Циклические ссылки — одна из самых частых проблем при реализации VIPER.
Retain cycle — ситуация, при которой два или более объекта удерживают друг друга сильными ссылками и не могут быть освобождены ARC.
VIPER состоит из нескольких взаимосвязанных компонентов:
View
Presenter
Interactor
Router
Между ними активно используются ссылки, и при неправильной настройке они легко образуют цикл.
Наиболее частый цикл:
View хранит Presenter (strong)
Presenter хранит View (strong)
class ViewController {
var presenter: Presenter
}
class Presenter {
var view: ViewController
}
ARC не может освободить ни один объект.
Presenter ↔ Interactor
Presenter ↔ Router
замыкания внутри Presenter или Interactor
Особенно опасны замыкания без [weak self].
экран не деинициализируется
растёт потребление памяти
сложно отлаживать
VIPER сам по себе не создаёт retain cycle, но из-за большого количества связей требует строгой дисциплины работы с weak и unowned ссылками.