четверг, 31 января 2013 г.

Xcode tips: отлавливаем memory leaks

Каждому разработчику в его практике рано или поздно, часто или редко приходится сталкиваться с утечками памяти. Штука не из приятных и поиск места где течёт – не самая тривиальная задача, так что давайте глянем как используя Instruments можно облегчить себе жизнь.



Итак, у нас на руках приложение, оно работает, но течёт. Пусть маломальски, но течёт.

  1. Собираем приложение для профайлинга ⌘+I. После того, как приложение соберётся, автоматически запустятся Instruments:
    Instruments после старта
  2. Далее выбираем Leaks, для того, чтобы профайлить именно утечки.
  3. После чего откроется окно профайлера и запустится приложение. В приложении надо поиграть, с оглядкой на профайлер, который будет на графике ликов показывать, когда что-то потечёт.
    Instruments какбэ говорит нам, что приложение течёт
  4. Когда достаточно наиграемся, а лучше остановится сразу после появления первых признаков течки, начинаем смотреть что же такое потекло. Для этого выбираем инструмент Leaks. Ниже, в таблице, появится список утечек.
    Чтобы посмотреть лики...
  5. Страшно, но ничего, всё будет хорошо. Мы видим кучу утёкших объектов, но правда в том, что вся эта куча могла утечь из-за косяка в одном единственном месте. Потому имеет смысл сгруппировать их по тому, какое место в коде отвечает за жизнь объекта (Responsible Frame).
  6. И вот уже теперь можно непосредственно заняться залатыванием щелей. Instruments позволяет просмотреть всю историю использования адресов, по которым потекли объекты. В этой истории нам интересны места, где объект mallo'чится, retain'ится, release'иться и удаляется (free).
    Чтобы перейти в историю использования адреса жмём на стрелку рядом с ним
    Собственно история
  7. Ну и теперь дело за малым, надо проследить, чтобы количество retain/release сошлось. Напомню, что в правильно написанном приложении объект, получивший другой объект во владение (вызвавший у него retain) так же в конце использования должен вызвать у него release. Выписываем на бумажку объекты, которые заретейнили что-то и вычёркиваем их, когда они это "что-то" релизят, а потом курим код, который нужного нам release'а не вызвал.

Комментариев нет:

Отправить комментарий