Назад к вопросам
Middle
75
questionbank
Какие ссылки имеются в объекте sitetable?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Сильные (strong), слабые (weak), безвладетельные (unowned).
- Strong: Создает владение объектом, предотвращая его деаллокацию, пока есть сильные ссылки.
- Weak: Не создает владение. Если объект, на который ссылается слабая ссылка, деаллоцируется, слабая ссылка автоматически становится nil. Используется для предотвращения циклов сильных ссылок, часто для ссылок на родительский объект или делегата.
- Unowned: Не создает владение. Подобна слабой ссылке, но гарантирует, что объект, на который она ссылается, будет существовать на протяжении всего жизненного цикла безвладетельной ссылки. Если попытаться получить доступ к объекту после его деаллокации, возникнет ошибка выполнения (краш). Используется, когда объекты имеют одинаковый или связанный жизненный цикл, и nil допустим, но не ожидается.
// Пример Strong
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Создает цикл сильных ссылок
parent = nil // Parent не будет деаллоцирован из-за сильной ссылки от child
child = nil // Child не будет деаллоцирован из-за сильной ссылки от parent
// Пример Weak
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Слабая ссылка
deinit {
print("ChildWeak deallocated")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated
// Пример Unowned
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Безвладетельная ссылка
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocated")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned должен существовать
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated