Ответ
Если все переменные объявить как 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 (по умолчанию).