Ответ
weak var используется для объявления слабой изменяемой ссылки с целью предотвращения цикла сильных ссылок (retain cycle). Слабая ссылка не увеличивает счетчик ссылок (retain count) и автоматически становится nil при освобождении объекта.
Основные сценарии использования:
-
Делегаты (Delegates):
protocol ViewControllerDelegate: AnyObject {} class ChildViewController { weak var delegate: ViewControllerDelegate? // Во избежание цикла: родитель -> ребенок -> родитель } -
Замыкания (Closures), захватывающие
self:class DataManager { var onDataUpdated: (() -> Void)? func fetchData() { networkService.requestData { [weak self] data in // Захват `weak self` предотвращает утечку памяти, // если `DataManager` будет освобожден до вызова замыкания. self?.process(data) } } }
Важные правила:
weakприменим только к ссылочным типам (классам).weakссылка всегда должна быть опциональной (var ...?), так как может статьnil.- Использование
weakне гарантирует немедленной деаллокации, но разрывает цикл, позволяя системе освободить память.