Что произойдёт, если все переменные в Swift объявить как weak?

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

Ответ

Если все переменные объявить как weak, это приведёт к следующим проблемам:

1. Немедленное освобождение объектов — ARC не будет удерживать сильные ссылки, поэтому объекты будут освобождаться сразу после создания.

weak var object = MyClass() // Объект будет немедленно деаллоцирован
print(object) // nil

2. Непредсказуемые краши — обращение к nil через опциональную цепочку или force unwrap вызовет runtime ошибки.

3. Некорректная работа UI — элементы интерфейса будут удаляться из иерархии, так как на них не будет сильных ссылок.

Когда использовать weak правильно:

  • Для делегатов — чтобы избежать retain cycles:

    protocol Delegate: AnyObject { /* ... */ }
    class Controller {
    weak var delegate: Delegate?
    }
  • В замыканиях — при захвате self:

    service.fetchData { [weak self] result in
    guard let self = self else { return }
    self.handleResult(result)
    }
  • В родительско-дочерних отношениях — когда дочерний объект не должен удерживать родителя.

Правило: Используйте weak только для break retain cycles в специфичных сценариях, а не для всех переменных. Большинство переменных должны быть strong (по умолчанию).