Ответ
Ключевое слово unowned безопасно использовать вместо weak только тогда, когда вы можете гарантировать, что захваченный объект переживёт (или будет существовать ровно столько же, сколько) замыкание или объект, который его хранит. В отличие от weak, unowned не делает ссылку опциональной и не обнуляется, что при обращении к освобождённой памяти вызовет краш.
Правило применения: Используйте unowned, когда время жизни захватываемого объекта и его "владельца" (например, замыкания) строго связано и вы уверены в порядке их деинициализации.
Классический безопасный пример — устранение цикла сильных ссылок между родителем и ребёнком:
class Parent {
var child: Child
init() {
child = Child(parent: self)
}
deinit { print("Parent deinit") }
}
class Child {
// Родитель гарантированно существует дольше ребёнка
unowned let parent: Parent
init(parent: Parent) {
self.parent = parent
}
deinit { print("Child deinit") }
}
Когда использовать unowned:
- В замыканиях, время выполнения которых строго ограничено временем жизни захваченного объекта (например, анимация, которая точно завершится до удаления вью).
- В связях типа "родитель-ребёнок", где родитель владеет ребёнком.
Когда всегда использовать weak:
- При асинхронных операциях (сетевые запросы, таймеры), где объект может быть деинициализирован до вызова замыкания.
- В протоколах делегатов.
- В любой ситуации, где нет 100% уверенности в порядке освобождения памяти.