Какие ограничения накладывает weak-ссылка в Swift?

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

Ответ

Weak-ссылка (weak) не создаёт сильного (strong) владения объектом, что помогает избежать циклов сильных ссылок. Её ключевые ограничения:

  • Всегда Optional: Поскольку weak-ссылка автоматически становится nil при освобождении объекта, она должна быть объявлена как опциональная (weak var delegate: SomeDelegate?).
  • Только для ссылочных типов: Weak работает исключительно с экземплярами классов (reference types). Для структур и перечислений (value types) она неприменима.
  • Отсутствие атомарности доступа: Чтение и запись weak-переменной не являются атомарными операциями. В многопоточной среде объект может быть освобождён между проверкой на nil и его использованием.
  • Не гарантирует немедленное обнуление: ARC может обнулить weak-ссылку не мгновенно, а в следующий run loop цикл.

Пример типичного использования для разрыва цикла ссылок:

class ViewController {
    weak var delegate: DataProviderDelegate? // Weak, чтобы не удерживать делегата
}

class DataProvider {
    var controller: ViewController? // Сильная ссылка
}
// При уничтожении DataProvider, ViewController может быть освобождён,
// так как delegate на него не держит сильную ссылку.