Вопрос проверяет понимание типов ссылок Swift и выбор подходящего типа для разных сценариев управления памятью.
weak хранит ссылку, которая автоматически обнуляется, когда объект деинициализируется, и требует опционального типа. unowned — неконтролируемая ссылка, не обнуляется и объявляется не-опциональным. unowned используют, когда зависимый объект гарантированно живет дольше или так же долго, как и владелец.
weak ссылка:
Объявляется как опциональная (weak var delegate: Delegate?).
ARC не увеличивает счётчик.
Автоматически становится nil при освобождении объекта.
unowned ссылка:
Объявляется как не-опциональная (unowned let owner: Owner).
ARC не увеличивает счётчик.
Не становится nil — при обращении к уже освобождённому объекту произойдёт креш.
Когда использовать unowned:
Когда объект B не может существовать без A и гарантированно живёт не дольше A.
Пример: замыкание в методе класса, которое ссылается на self без захвата в weak.
Пример:
class Owner {
var child: Child?
}
class Child {
unowned let owner: Owner
init(owner: Owner) { self.owner = owner }
}
let owner = Owner()
owner.child = Child(owner: owner)
// owner и child будут освобождены без утечкиВывод:
Выбор между weak и unowned зависит от жизненного цикла объектов. unowned быстрее, но безопасен лишь в сценариях строго управляемых связей.