Ни одна строка deinit не будет напечатана: Alpha и Beta образуют цикл сильных ссылок и остаются удержанными после betaInstance = nil.
Какой вывод будет получен в примере №14
Ни одна строка 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. Альтернативно связь можно явно очистить до потери внешнего доступа, однако это менее надёжная модель жизненного цикла.