Вопрос проверяет понимание модели захвата переменных в Swift и умение писать безопасный код с замыканиями.
Вопрос проверяет понимание модели захвата переменных в Swift и умение писать безопасный код с замыканиями.
Замыкания — мощный, но потенциально опасный инструмент, потому что они неявно управляют ссылками.
Замыкание — объект, который может захватывать и хранить переменные из внешнего контекста.
По умолчанию:
все используемые ссылочные типы захватываются strong
захват происходит в момент создания замыкания
Это означает, что замыкание может жить дольше, чем кажется на первый взгляд.
Самый распространённый случай:
Объект хранит замыкание в своём свойстве
Замыкание использует self
self удерживает замыкание
Замыкание удерживает self
Цикл замкнулся.
completion-блоки
callbacks SDK
асинхронные операции
таймеры и анимации
Combine / Rx подписки
Явно управлять ссылками:
callback = { [weak self] in
self?.doSomething()
}
очищать замыкания при завершении работы
обнулять callbacks в deinit
не хранить долгоживущие замыкания во вью-контроллерах
выносить логику в сервисы
Замыкания становятся источником утечек не из-за Swift, а из-за неявного захвата ссылок. Явное управление capture list — обязательная практика.