Назад к вопросам
Junior
118
questionbank
В чем разница между `weak` и `strong` ссылками в языке Swift?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Swift strong — это ссылка по умолчанию. Она удерживает объект в памяти до тех пор, пока на него есть хотя бы одна strong ссылка.
weak — это слабая ссылка. Она не удерживает объект в памяти и может стать nil, если на объект больше нет strong ссылок. Используется для предотвращения сильных циклов ссылок, например, между родительским и дочерним объектами.
strong: Увеличивает счетчик ссылок.weak: Не увеличивает счетчик ссылок.
Пример сильного цикла:
class Person {
let name: String
var apartment: Apartment?
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
var tenant: Person?
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
john = nil // Deinit не вызывается
unit4A = nil // Deinit не вызывается
Пример с использованием weak для разрыва цикла:
class Person {
let name: String
var apartment: Apartment?
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
weak var tenant: Person? // weak ссылка
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
john = nil // Person deinitialized
unit4A = nil // Apartment deinitialized