Нет, не всегда.
Используем weak или unowned в Capture List для предотвращения retain cycles.
Retain cycle возникает, когда два или более объекта сильно ссылаются друг на друга, не позволяя памяти быть освобожденной.
Использовать weak или unowned нужно, когда замыкание сильной ссылается на self (или другую переменную экземпляра класса/актора), и в свою очередь self (или другой объект) имеет сильную ссылку на это замыкание.
Примеры ситуаций, где это необходимо:
Если замыкание не захватывает self (или другую переменную класса/актора, которая имеет сильную ссылку на замыкание), или захватывает структурные типы/перечисления, использование weak или unowned не требуется.
Разница между weak и unowned:
| Тип | Описание | Когда использовать |
|---|---|---|
weak | Слабая (опциональная) ссылка. Может стать nil. | Когда жизненный цикл замыкания короче или равен жизненному циклу захватываемого объекта, и объект может стать nil до завершения замыкания. |
unowned | Неосновная (неопциональная) ссылка. Не может стать nil. | Когда жизненный цикл замыкания короче или равен жизненному циклу захватываемого объекта, и гарантировано, что объект будет существовать до завершения замыкания. Если объект освободится до выполнения замыкания, произойдет краш (unowned reference to deallocated instance). |
Пример использования weak в Capture List:
swift
Пример использования unowned в Capture List:
swift
Если замыкание не образует retain cycle, использование weak или unowned не обязательно и может даже привести к ненужным проверкам (в случае weak) или потенциальным крашам (в случае unowned).
Например, замыкание, не захватывающее self или другой объект, сильная ссылка на который есть у замыкания:
swift
В данном случае [weak self] или [unowned self] в Capture List не требуется.