Для показанной цепочки ожидается C, A, B, A: сначала deinit Gamma и его суперкласса, затем освобождаются принадлежащие ему объекты.
Какой вывод получит программа №13
Для показанной цепочки ожидается C, A, B, A: сначала deinit Gamma и его суперкласса, затем освобождаются принадлежащие ему объекты.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрите следующий Swift‑код и определите, какие строки будут выведены в консоль при завершении программы.
import UIKit
class Alpha {
deinit {
print("A")
}
}
class Beta {
let a = Alpha()
deinit {
print("B")
}
}
class Gamma: Alpha {
let b = Beta()
deinit {
print("C")
}
}
var instance: Gamma? = Gamma()
instance = nil
Ответ
Для показанной цепочки ожидается C, A, B, A: сначала deinit Gamma и его суперкласса, затем освобождаются принадлежащие ему объекты.
Первое A относится к части Alpha самого экземпляра Gamma, а не к полю Beta.a. После выполнения deinit по цепочке наследования освобождается поле Gamma.b: его Beta печатает B, а освобождение собственного поля a печатает второе A. Здесь нет циклов удержания и внешних ссылок на b/a, поэтому они также уничтожаются. Важно различать наследование Gamma: Alpha и композицию Gamma → Beta → отдельный Alpha.
Источник: forums.swift.org.