Создание взаимной ссылки (retain cycle) между двумя объектами

Достаточно двух классов с сильными optional-ссылками друг на друга. После удаления внешних ссылок их deinit не выполнится, пока цикл не разорван.

Короткий ответ

Что ответить на собеседовании

Достаточно двух классов с сильными optional-ссылками друг на друга. После удаления внешних ссылок их deinit не выполнится, пока цикл не разорван.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать два класса и установить между их экземплярами взаимную сильную ссылку, образующую retain‑cycle.

Ответ

Достаточно двух классов с сильными optional-ссылками друг на друга. После удаления внешних ссылок их deinit не выполнится, пока цикл не разорван.

final class First {
    var second: Second?
    deinit { print("First released") }
}
final class Second {
    var first: First?
    deinit { print("Second released") }
}
var first: First? = First()
var second: Second? = Second()
first?.second = second
second?.first = first
first = nil
second = nil

Это намеренный пример утечки, а не рекомендуемая модель. Для исправления определяют владельца и делают обратную ссылку weak, например weak var first: First?. Ставить обе ссылки weak тоже можно, но тогда жизнью объектов должен управлять внешний владелец.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее