Подтвердить что ты не робот

Инструменты Выделение дорожек alloc и dealloc объектов пользовательских классов

Можно ли отслеживать распределение и освобождение объектов Objective-C? Например, если у меня есть классная книга, я хочу отслеживать все распределения и освобождения объектов типа Book. Я могу отслеживать все классы SKD по умолчанию, такие как UIViewController, UIWindow, UIView, NSDictionary и все такое, но я хочу также отслеживать объекты, созданные из определенных классов.

4b9b3361

Ответ 1

Вы можете использовать инструмент Allocations для отслеживания жизненного цикла ваших объектов. Если вы используете шаблон "Allocations", он настроен на запись событий malloc и free. Вы можете настроить его так же, как и запись событий retain, release и autorelease, включив флажок "Запись отсчетов" в настройках инструмента "Выделения":

record reference counts checkbox

(Вы не можете переключать это, пока инструменты записываются, и он запускается по умолчанию, как только вы выбираете свой шаблон.)

Обновление для Xcode 9: Apple затрудняет поиск этих параметров. Теперь вам нужно выбрать инструмент Allocations, затем в строке меню выберите "Файл" > "Параметры записи".

После запуска вы можете найти свои объекты, используя представление "Распределение" > "Статистика" > "Сводка объектов", которое является настройкой по умолчанию для панели "Детали" (нижняя половина окна):

Object Summary setting for Detail pane

Если вы хотите увидеть объекты, которые были освобождены до того, как вы остановили прогон, вам необходимо изменить настройку продолжительности распределения между "Созданный и неподвижный" (по умолчанию) на "Все созданные объекты":

Allocation Lifespan setting

Чтобы найти объекты определенного класса, начните с ввода имени класса в поле поиска в правом конце панели инструментов окна. Затем найдите имя класса в столбце "Категория" в виде списка, наведите указатель мыши на него и щелкните стрелку рядом с ней. Например, у моего приложения есть класс с именем Tile, поэтому я его ищу, а затем нажмите стрелку рядом с Tile в представлении списка:

Searching

Теперь в представлении списка отображается каждый экземпляр Tile. (Обратите внимание, что вы должны ввести фактический класс объекта, а не суперкласс. Ввод NSObject будет искать объекты, созданные только [NSObject alloc], а не объекты, созданные с помощью [Tile alloc].) Я вижу историю для любого конкретного экземпляра, щелкнув стрелку рядом с этим адресом экземпляра:

Getting detail

В подробном представлении для объекта я могу видеть события malloc и free, и, поскольку я включил "Счет ссылок на запись", я также могу видеть retain, release и autorelease и их влияние на счет сохранения объекта. Если я хочу увидеть стек вызовов для любого из этих событий, я могу открыть панель расширенных подробностей в правой части окна:

extended detail of call stack