С какими типами в Swift можно использовать модификатор weak?

«С какими типами в Swift можно использовать модификатор weak?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модификатор weak можно применять только к ссылочным типам (классам). Это связано с тем, что weak участвует в механизме подсчёта ссылок (ARC), который управляет временем жизни экземпляров классов.

Почему только классы?

  • Классы (Reference types) хранятся в куче, и их время жизни управляется ARC. weak создаёт некрепкую ссылку, которая не увеличивает счётчик ссылок и автоматически обнуляется (nil), когда объект уничтожается.
  • Структуры и перечисления (Value types) не используют ARC и передаются по значению, поэтому для них концепция weak ссылки не имеет смысла.

Основное применение: Предотвращение сильных циклов удержания (retain cycles), особенно в паттернах «делегат» и при захвате self в замыканиях.

class ViewController {
    // Делегат объявлен как weak, чтобы не создавать цикл удержания
    weak var delegate: SomeDelegate?
}

class MyClass {
    var closure: (() -> Void)?

    func setupClosure() {
        // Захват self как weak ссылки внутри замыкания
        closure = { [weak self] in
            guard let self = self else { return }
            self.doSomething()
        }
    }
}

Важное правило: Поскольку weak ссылка может стать nil, она всегда должна быть объявлена как опциональная переменная (var).