Можно ли отслеживать распределение и освобождение объектов Objective-C? Например, если у меня есть классная книга, я хочу отслеживать все распределения и освобождения объектов типа Book. Я могу отслеживать все классы SKD по умолчанию, такие как UIViewController, UIWindow, UIView, NSDictionary и все такое, но я хочу также отслеживать объекты, созданные из определенных классов.
Инструменты Выделение дорожек alloc и dealloc объектов пользовательских классов
Ответ 1
Вы можете использовать инструмент Allocations для отслеживания жизненного цикла ваших объектов. Если вы используете шаблон "Allocations", он настроен на запись событий malloc
и free
. Вы можете настроить его так же, как и запись событий retain
, release
и autorelease
, включив флажок "Запись отсчетов" в настройках инструмента "Выделения":
(Вы не можете переключать это, пока инструменты записываются, и он запускается по умолчанию, как только вы выбираете свой шаблон.)
Обновление для Xcode 9: Apple затрудняет поиск этих параметров. Теперь вам нужно выбрать инструмент Allocations, затем в строке меню выберите "Файл" > "Параметры записи".
После запуска вы можете найти свои объекты, используя представление "Распределение" > "Статистика" > "Сводка объектов", которое является настройкой по умолчанию для панели "Детали" (нижняя половина окна):
Если вы хотите увидеть объекты, которые были освобождены до того, как вы остановили прогон, вам необходимо изменить настройку продолжительности распределения между "Созданный и неподвижный" (по умолчанию) на "Все созданные объекты":
Чтобы найти объекты определенного класса, начните с ввода имени класса в поле поиска в правом конце панели инструментов окна. Затем найдите имя класса в столбце "Категория" в виде списка, наведите указатель мыши на него и щелкните стрелку рядом с ней. Например, у моего приложения есть класс с именем Tile
, поэтому я его ищу, а затем нажмите стрелку рядом с Tile
в представлении списка:
Теперь в представлении списка отображается каждый экземпляр Tile
. (Обратите внимание, что вы должны ввести фактический класс объекта, а не суперкласс. Ввод NSObject
будет искать объекты, созданные только [NSObject alloc]
, а не объекты, созданные с помощью [Tile alloc]
.) Я вижу историю для любого конкретного экземпляра, щелкнув стрелку рядом с этим адресом экземпляра:
В подробном представлении для объекта я могу видеть события malloc
и free
, и, поскольку я включил "Счет ссылок на запись", я также могу видеть retain
, release
и autorelease
и их влияние на счет сохранения объекта. Если я хочу увидеть стек вызовов для любого из этих событий, я могу открыть панель расширенных подробностей в правой части окна: