Вопрос проверяет понимание ARC и способов предотвращения утечек памяти.
Для разрыва retain cycle в Swift используются ключевые слова weak и unowned. Они позволяют ссылке не увеличивать счетчик сильных ссылок объекта. weak используется, когда объект может быть освобожден раньше. unowned — когда гарантируется, что объект живет дольше. Правильный выбор зависит от жизненного цикла объектов.
Retain cycle возникает, когда объекты удерживают друг друга сильными ссылками и не могут быть освобождены ARC.
Определение:
Retain cycle — это ситуация, при которой два или более объекта имеют взаимные сильные ссылки и поэтому никогда не деаллоцируются.
Чаще всего это происходит:
Между объектами
Между объектом и замыканием
В делегатах и callback-ах
weakweak используется, когда объект может быть освобожден в любой момент.
Ссылка не увеличивает retain count
Автоматически становится nil
Всегда объявляется как optional
weak var delegate: SomeDelegate?
unownedunowned используется, когда объект гарантированно живет дольше.
Не увеличивает retain count
Не является optional
Обращение к освобожденному объекту приведет к крэшу
unowned let parent: Parent
weak — безопасный выбор по умолчанию. unowned применяется только тогда, когда жизненный цикл объектов полностью контролируем и предсказуем.