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


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

1 56

1 ответ:

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

record reference counts checkbox

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

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

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

Object Summary setting for Detail pane

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

Allocation Lifespan setting

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

Searching

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

Getting detail

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

extended detail of call stack