Как искать и устранять утечки памяти в iOS-приложении?

«Как искать и устранять утечки памяти в iOS-приложении?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поиск утечек — рутинная задача для iOS-разработчика. Основной инструмент — Instruments в Xcode.

Процесс:

  1. Запустить приложение через Profile (Cmd + I).
  2. Выбрать шаблон Leaks или Allocations.
  3. Воспроизвести сценарий (например, открыть/закрыть экран несколько раз).
  4. Анализировать граф памяти и список утечек.

Типичные причины и решения:

  • 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-панели) для визуального обнаружения циклов в рантайме.