Используйте [weak self] или [unowned self] в capture list; дальше работайте с self? или guard let self.
Разбор
- escaping async, Timer, NotificationCenter — типичный риск.
- unowned только при гарантированном lifetime.
- Цикл часто выглядит как VC → service → closure → VC.
- deinit при уходе с экрана подтверждает отсутствие утечки.
Итог
Capture list weak разрывает цикл объект↔closure.