Какой аналог weak ссылки существует в Swift и в чем его особенность?

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

Ответ

unowned — это аналог weak, который также не увеличивает счетчик сильных ссылок (retain count).

Ключевая особенность unowned: он объявляется как неопциональный тип и не становится nil после освобождения объекта. Вместо этого обращение к освобожденной unowned ссылке приводит к неопределенному поведению и крашу.

Сравнение на примере:

// weak ссылка (опциональная, безопасная)
class ViewController {
    weak var delegate: DataDelegate? // Может стать nil
}

// unowned ссылка (неопциональная, требует гарантий)
class CreditCard {
    unowned let owner: Customer // Не опциональна. Предполагается, что owner всегда есть.
    init(owner: Customer) { self.owner = owner }
}

Правила выбора:

  • Используйте weak, если ссылка может стать nil в течение жизни объекта (делегаты, IBOutlet, замыкания, захватывающие self).
  • Используйте unowned, только если вы абсолютно уверены, что объект, на который ссылаются, никогда не будет освобожден раньше, чем ссылающийся объект. Типичный случай — двунаправленная связь, где один объект является явным владельцем другого.

⚠️ Предупреждение: unowned — это оптимизация и явный контракт. Неверное использование — частая причина сложно отлаживаемых падений.