Назад к вопросам
Middle
117
questionbank
Какие преимущества использования 'Unowned' в Swift?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
- Предотвращение циклических сильных ссылок (retain cycles).
- Применяется, когда один объект имеет такую же или более длительную продолжительность жизни по сравнению с другим, и всегда будет иметь ссылку на этот другой объект.
- Компилятор гарантирует, что ссылка 'unowned' всегда указывает на действительный объект. Если попытаться получить доступ к 'unowned' ссылке после освобождения объекта, приложение аварийно завершит работу. Это делает ошибки с 'unowned' более явными и помогает быстрее обнаружить проблемы.
- Не добавляет счетчик ссылок объекту, что немного эффективнее с точки зрения производительности по сравнению со 'weak'.
class Person {
let name: String
var car: Car?
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
class Car {
let model: String
unowned let owner: Person // Unowned reference to Person
init(model: String, owner: Person) {
self.model = model
self.owner = owner // owner must not be nil
print("\(model) is being initialized")
}
deinit {
print("\(model) is being deinitialized")
}
}
var kevin: Person? = Person(name: "Kevin")
var bmw: Car? = Car(model: "BMW", owner: kevin!) // Pass kevin as non-optional
kevin?.car = bmw
// Setting kevin to nil will deinitialize both objects,
// since owner is unowned and does not create a strong reference cycle.
kevin = nil
// Output:
// Kevin is being initialized
// BMW is being initialized
// Kevin is being deinitialized
// BMW is being deinitialized