Ответ
Поиск утечек — рутинная задача для iOS-разработчика. Основной инструмент — Instruments в Xcode.
Процесс:
- Запустить приложение через Profile (
Cmd + I). - Выбрать шаблон Leaks или Allocations.
- Воспроизвести сценарий (например, открыть/закрыть экран несколько раз).
- Анализировать граф памяти и список утечек.
Типичные причины и решения:
-
Retain Cycle (Сильные ссылочные циклы):
class MyViewController: UIViewController { var handler: (() -> Void)? override func viewDidLoad() { super.viewDidLoad() // ❌ УТЕЧКА: замыкание сильно ссылается на `self` handler = { self.doSomething() } } // ✅ ИСПРАВЛЕНИЕ: использовать weak или unowned ссылку handler = { [weak self] in self?.doSomething() } } -
Сильные ссылки в делегатах: Всегда объявлять делегаты как
weak.protocol MyDelegate: AnyObject {} class MyClass { weak var delegate: MyDelegate? // ✅ } -
Неинвалидированные таймеры или observers:
// Таймер var timer: Timer? deinit { timer?.invalidate() // ✅ Обязательно инвалидировать } // NotificationCenter deinit { NotificationCenter.default.removeObserver(self) }
Дополнительно: Используйте Memory Graph Debugger (кнопка в Debug-панели) для визуального обнаружения циклов в рантайме.