Какой вывод будет получен в примере №14

Ни одна строка deinit не будет напечатана: Alpha и Beta образуют цикл сильных ссылок и остаются удержанными после betaInstance = nil.

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

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

Ни одна строка deinit не будет напечатана: Alpha и Beta образуют цикл сильных ссылок и остаются удержанными после betaInstance = nil.

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

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

Условие

Рассмотрим два класса, которые держат ссылки друг на друга, и посмотрим, какие сообщения появятся в консоли после разрушения объектов.

class Alpha {
    var betaReference: Beta? = nil
    deinit { print("Alpha deinitialized") }
}

class Beta {
    var alphaReference = Alpha()
    deinit { print("Beta deinitialized") }
}

var betaInstance: Beta? = Beta()
betaInstance?.alphaReference.betaReference = betaInstance
betaInstance = nil

После выполнения кода необходимо определить, какие строки будут выведены в консоль.

Ответ

Ни одна строка deinit не будет напечатана: Alpha и Beta образуют цикл сильных ссылок и остаются удержанными после betaInstance = nil.

Beta создаёт Alpha и сильно хранит его в alphaReference. Затем Alpha получает сильную обратную betaReference на тот же Beta. Обнуление внешней optional-переменной убирает только одну ссылку, но не разрывает кольцо. Обычно обратную ссылку делают weak var betaReference: Beta?, если Alpha не должен владеть Beta. Альтернативно связь можно явно очистить до потери внешнего доступа, однако это менее надёжная модель жизненного цикла.

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

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

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

Подробнее