
ViewController — это один из компонентов, где обычно происходит утечка памяти, поскольку именно он чаще всего используется для хранения множества частей кода вместе. Одна ошибка, и в итоге вы получаете утечку.
Apple предлагает отличный инструмент для отладки утечек памяти. Часто для этого используется метод print в deinit.
deinit {
print("deinit (self)")
}
Если произошла утечка, deinit не будет вызван, и ничего не будет выведено. Даже если это не очень хорошо выглядит, это вполне рабочий вариант.
Примечание
Если вы найдёте статью интересной, то в этом канале я пишу об iOS-разработке.
Более качественный способ
Можно использовать Symbolic breakpoint, чтобы обнаружить retain cycles для UIViewController. Это та же концепция, что print выше, но гораздо чище. Таким образом, вы не накидываете в код лишние print.
Простая инструкция
Перейдите в Breakpoint Navigator (меню View > Navigators > Show Breakpoint Navigator или ⌘ - command + 8). Кстати, для шорткатов можно использовать и это решение: вот оно.
Нажмите + и выберите Symbolic Breakpoint... or Menu Debug > Breakpoints > Create Symbolic Breakpoint...

Установите для
Symbol
значение-[UIViewController dealloc]

Нажмите кнопку Add Action и установите звук
Sound
в (ну или любой другой, какой посчитаете нужным).Добавьте ещё одно действие, нажав +.
Установите действие на Log Message и задайте сообщение, которое вы хотите вывести в консоль, когда сработает dealloc для View Controller. В моем случае я установил его в --- dealloc @(id)[
Пример создания Log Message Отметьте опцию Automatically continue after evaluating actions, поскольку мы не хотим, чтобы дебаггер останавливался, когда сработает наш Symbolic Breakpoint.
Отметьте чекбокс, чтобы не было остановки дебаггера (отладчика) Обнаружение утечки
С установленным брейкпоинтом всякий раз, когда для UIViewController сработает
dismiss
, или, например,pop
из навигационного стека, вы услышите соответствующий звук и увидите лог в консоли. Это означает, что все работает именно так, как ожидалось.Если вы выводите или удаляете
ViewController
, но не слышите соответствующего звука, это означает только одно — произошла утечка.Итак, что потребуется для обнаружения утечек
Symbol
— [UIViewController dealloc]Module
— пустой или UIKitCoreAction:Sound
— pop или любой другой звукAction: Log Message
— --- dealloc @(id)[" class="formula inline">arg1 description]@ или любое другое сообщениеOptions
— можно установить Automatically continue after evaluating actionsПримеры
Если вы нашли что-то полезное для себя, то подписывайтесь на мой канал, тут больше интересных историй и подходов.
Авторский канал об iOS-разработке