Назад к вопросам
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