Всегда ли weak-ссылка в Swift является опционалом?

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

Ответ

Да, weak-ссылка в Swift всегда имеет опциональный тип (Type?). Это прямое следствие механизма управления памятью (ARC).

Причина: weak-ссылка не увеличивает счетчик сильных ссылок (strong reference count) на объект. Когда на объект больше не остается сильных ссылок, ARC немедленно освобождает его память. Все weak-ссылки на этот объект автоматически устанавливаются в nil, чтобы предотвратить обращение к освобожденной памяти (dangling pointer).

Пример:

class Person {
    let name: String
    init(name: String) { self.name = name }
}

// weak-ссылка обязана быть опционалом
weak var optionalRef: Person? = Person(name: "Alice")
// После выхода из области видимости, если других strong ссылок нет,
// optionalRef автоматически станет nil

Сравнение с unowned:

  • weak: Всегда Optional. Безопасна, становится nil.
  • unowned: Не опционал. Предполагает, что объект живет дольше ссылки. Обращение после деаллокации вызовет краш.

Практическое применение: weak используется для разрыва циклов сильных ссылок, особенно в паттернах делегат (delegate) и внутри замыканий (closures), чтобы избежать утечек памяти.