Ответ
Weak-ссылки в Swift являются опциональными и автоматически обнуляемыми (zeroing). Это делает их обращение безопасным по дизайну языка.
Принцип работы:
- Weak-ссылка не увеличивает счетчик ссылок (retain count) объекта.
- Когда объект деаллоцируется, runtime автоматически устанавливает все weak-ссылки на него в
nil. - Обращение к
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.