Достаточно двух классов с сильными optional-ссылками друг на друга. После удаления внешних ссылок их deinit не выполнится, пока цикл не разорван.
Создание взаимной ссылки (retain cycle) между двумя объектами
Достаточно двух классов с сильными 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 тоже можно, но тогда жизнью объектов должен управлять внешний владелец.