Ответ
unowned — это модификатор ссылки в Swift, который, как и weak, не увеличивает счетчик сильных ссылок (retain count), но с критическим отличием: он предполагает, что объект назначения никогда не станет nil в течение времени жизни ссылки. Если объект освобождается, обращение к unowned-ссылке вызывает краш приложения (dangling pointer).
Ключевые отличия от weak:
weakссылки всегда optional (weak var delegate: Delegate?) и автоматически обнуляются (nil).unownedссылки non-optional (unowned let parent: Parent) и не обнуляются.
Когда использовать unowned:
- Когда время жизни объекта и ссылки совпадает или объект живет дольше.
- Для устранения циклов сильных ссылок в отношениях, где один объект логически "владеет" другим (например, родитель-ребенок).
Пример безопасного использования:
class Customer {
let id: String
var card: CreditCard?
init(id: String) { self.id = id }
}
class CreditCard {
let number: String
// Карта не может существовать без клиента. Клиент живет дольше.
unowned let customer: Customer
init(number: String, customer: Customer) {
self.number = number
self.customer = customer
}
}
var john: Customer? = Customer(id: "12345")
john!.card = CreditCard(number: "1111-2222", customer: john!)
john = nil // Теперь и Customer, и CreditCard освобождены. Обращение к card.customer вызовет краш.
Правило: Используйте unowned только при абсолютной уверенности, что объект не будет освобожден раньше ссылки. В сомнительных случаях предпочитайте weak.