Зачем нужен тип ссылок unowned?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
unowned ссылки нужны для разрешения циклических ссылок (retain cycles) между объектами, когда оба объекта имеют сильную ссылку друг на друга, но при этом один из объектов имеет жизненный цикл короче или равный другому.
unowned используется, когда известно, что ссылаемый объект не будет nil на протяжении всего времени жизни объекта, содержащего ссылку. В отличие от weak, при доступе к unowned ссылке не используется Optional. Если объект, на который ссылается unowned, будет деаллоцирован до того, как деаллоцируется объект с unowned ссылкой, произойдет крэш.
Пример использования в замыканиях:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
class Apartment {
let unit: String
// Используем unowned, так как известно, что
// Apartment не может существовать без Person
// (в данном контексте). Person может быть nil,
// но если Apartment существует, Person тоже существует.
unowned let tenant: Person?
init(unit: String, tenant: Person?) {
self.unit = unit
self.tenant = tenant
print("Apartment \(unit) is being initialized")
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
// В данном примере tenant может быть nil, поэтому unowned optional
unit4A = Apartment(unit: "4A", tenant: john)
john!.apartment = unit4A
// Разорвем сильные ссылки, чтобы проверить деаллокацию
john = nil
unit4A = nil
В данном примере Person имеет сильную ссылку на Apartment (var apartment: Apartment?). Apartment мог бы иметь сильную ссылку на Person, что привело бы к циклу. Однако, поскольку в контексте этого примера Apartment логически не может существовать без Person (который его арендует), связь от Apartment к Person делается unowned. Таким образом, при обнулении john = nil, Person деаллоцируется, а вслед за ним (поскольку нет сильных ссылок на Apartment) деаллоцируется и Apartment.
Основные отличия от weak:
- Жизненный цикл:
unownedиспользуется, когда ссылаемый объект имеет такой же или более длительный жизненный цикл.weakиспользуется, когда ссылаемый объект может быть деаллоцирован раньше. - Optional:
unownedне является Optionsl (если не объявлен какunowned optional).weakвсегда Optional. - Безопасность: Доступ к проперти с
unownedссылкой к уже деаллоцированному объекту приведет к крэшу. Доступ кweakссылке вернетnil.
Таким образом, unowned - это невладеющая (non-owning) ссылка, которая используется, когда гарантируется существование ссылаемого объекта до тех пор, пока существует объект с unowned ссылкой.