Почему обращение к weak-переменной, содержащей nil, безопасно в Swift?

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

Ответ

Weak-ссылки в Swift являются опциональными и автоматически обнуляемыми (zeroing). Это делает их обращение безопасным по дизайну языка.

Принцип работы:

  1. Weak-ссылка не увеличивает счетчик ссылок (retain count) объекта.
  2. Когда объект деаллоцируется, runtime автоматически устанавливает все weak-ссылки на него в nil.
  3. Обращение к weak var всегда возвращает опциональное значение (Type?). Попытка доступа после деаллокации просто вернет nil, а не приведет к dangling pointer или краху.

Пример:

class Controller {
    weak var delegate: DataDelegate? // Автоматически станет nil
}

let controller = Controller()
controller.delegate = DataDelegate()
// ...
// Когда DataDelegate деаллоцируется:
print(controller.delegate) // Безопасно выведет 'nil'

Преимущества:

  • Предотвращает retain cycles в отношениях типа «делегат» или «родитель-потомок».
  • Гарантирует безопасность памяти без ручного отслеживания времени жизни объектов.
  • Атомарность: Операции чтения/записи weak-переменных потокобезопасны на уровне runtime.