Что такое Memory Graph в Xcode и для чего он используется?

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

Ответ

Memory Graph (или Debug Memory Graph) — это визуальный инструмент отладки в Xcode, который показывает граф объектов, находящихся в памяти во время выполнения приложения, и связи между ними. Его основная цель — обнаружение циклических сильных ссылок (retain cycles) и других аномалий управления памятью.

Как использовать:

  1. Запустите приложение в Xcode.
  2. Во время работы нажмите кнопку Debug Memory Graph (иконка графа на панели отладки).
  3. Xcode сделает снимок памяти и отобразит все живые объекты в виде узлов графа. Стрелки указывают на сильные ссылки.

Пример проблемы в графе:

class ViewController: UIViewController {
    var closure: (() -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Цикл: self сильно ссылается на closure, а closure сильно ссылается на self
        closure = { 
            self.doSomething() // Захват self без [weak self]
        }
    }
    func doSomething() {}
}

В Memory Graph вы увидите, что ViewController и захваченный им closure указывают друг на друга, образуя цикл, который не позволит ARC освободить память.

Что искать в Memory Graph:

  • Неожиданные сильные ссылки: Объекты, которые должны были быть освобождены, но остаются в памяти.
  • Циклы: Два или более объекта, ссылающихся друг на друга через сильные ссылки.
  • Массовые удержания: Один объект удерживает огромную подграфу других объектов.

Преимущества перед Instruments:

  • Интерактивность: Можно щелкать по объектам, видеть их свойства и ссылки в реальном времени.
  • Интеграция: Работает прямо в среде разработки, не требуя отдельного профилировщика.
  • Наглядность: Визуальное представление упрощает понимание сложных связей.