Что такое модификатор памяти weak в Swift?

Модификатор weak используется для разрыва циклов сильных ссылок (reference cycles) между объектами, когда один объект имеет сильную ссылку на другой, а тот в свою очередь имеет сильную ссылку обратно.

Короткий ответ

Что ответить на собеседовании

Модификатор weak используется для разрыва циклов сильных ссылок (reference cycles) между объектами, когда один объект имеет сильную ссылку на другой, а тот в свою очередь имеет сильную ссылку обратно.

Подробный разбор

Ответ с пояснениями

Модификатор weak используется для разрыва циклов сильных ссылок (reference cycles) между объектами, когда один объект имеет сильную ссылку на другой, а тот в свою очередь имеет сильную ссылку обратно.

Основные характеристики weak:

  • Не увеличивает счетчик ссылок: Использование weak не увеличивает количество сильных ссылок на объект.
  • Может быть nil: Слабая ссылка является опциональной (Optional) и автоматически становится nil, когда объект, на который она ссылается, деинициализируется.
  • Используется для родителя/ребенка: Часто применяется, когда дочерний объект имеет ссылку на своего родителя, чтобы избежать цикла сильных ссылок.
  • Требует объявления как var: Поскольку слабая ссылка может стать nil, она должна быть переменной (var), а не константой (let).

Пример:

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
    weak var tenant: Person? // Слабая ссылка

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) is being initialized")
    }

    deinit {
        print("Apartment \(unit) is being deinitialized")
    }
}

Без weak var tenant: Person? в классе Apartment возник бы цикл сильных ссылок, и экземпляры Person и Apartment не были бы деинициализированы, когда на них больше не было бы других сильных ссылок. Благодаря weak, когда экземпляр Person деинициализируется, ссылка tenant в экземпляре Apartment автоматически становится nil.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее