Когда в Swift используется `weak var`?

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

Ответ

weak var используется для объявления слабой изменяемой ссылки с целью предотвращения цикла сильных ссылок (retain cycle). Слабая ссылка не увеличивает счетчик ссылок (retain count) и автоматически становится nil при освобождении объекта.

Основные сценарии использования:

  1. Делегаты (Delegates):

    protocol ViewControllerDelegate: AnyObject {}
    
    class ChildViewController {
        weak var delegate: ViewControllerDelegate? // Во избежание цикла: родитель -> ребенок -> родитель
    }
  2. Замыкания (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 не гарантирует немедленной деаллокации, но разрывает цикл, позволяя системе освободить память.