Как мне установить NSZombieEnabled в Xcode 4?

Как мне настроить NSZombieEnabled а также CFZombieLevel для моего исполняемого файла в Xcode 4?

7 ответов

Решение

В Xcode 4.x нажмите

⌘ ⌘ R

(или нажмите Menubar > Product > Scheme > Edit Scheme)

выберите вкладку "Диагностика" и нажмите "Включить объекты зомби":

Нажмите 'Включить объекты зомби'

Это превращает освобожденные объекты в экземпляры NSZombie, которые выводят предупреждения консоли при повторном использовании. Это средство отладки, которое увеличивает использование памяти (на самом деле ни один объект не освобожден), но улучшает отчеты об ошибках.

Типичный случай, когда вы перепроизводите объект и не знаете какой:

  • С зомби: -[UITableView release]: message sent to deallocated instance
  • Без зомби EXC_BAD_ACCESS

Этот параметр XCode игнорируется, когда вы архивируете приложение для отправки в App Store. Вам не нужно ничего трогать перед выпуском приложения.

Нажатие ⌥⌘R аналогично выбору "Продукт"> "Выполнить", удерживая нажатой клавишу "Alt".
Установка флажка "Включить объекты-зомби" аналогична добавлению "NSZombieEnabled = YES" вручную в разделе "Переменные среды" на вкладке "Аргументы".

Ответ Яно - самый простой способ найти его. Другой способ - щелкнуть раскрывающийся список схем -> изменить схему -> вкладку аргументов, а затем добавить NSZombieEnabled в столбце "Переменные среды" и YES в столбце значений...

Я считаю эту альтернативу более удобной:

  1. Нажмите кнопку "Run Button Dropdown"
  2. Из списка выберите Profile
  3. Программа "Инструменты" должна открыться там, где вы также можете выбрать Zombies
  4. Теперь вы можете взаимодействовать с вашим приложением и попытаться вызвать ошибку
  5. Как только возникает ошибка, вы должны получить подсказку, когда ваш объект был освобожден и, следовательно, освобожден.

Zombies

Как только зомби обнаружен, вы получаете аккуратный "стек зомби", который показывает вам, когда данный объект был выделен и где он был сохранен или выпущен:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Преимущества по сравнению с использованием вкладки диагностики схем Xcode:

  1. Если вы забыли снять флажок с вкладки "Диагностика", то никакие объекты не будут освобождены из памяти.

  2. Вы получаете более подробный стек, показывающий, какими методами был выделен / освобожден или сохранен ваш поврежденный объект.

В Xcode 4.2

  • Название проекта / Схема редактирования / Диагностика /
  • Флажок Включить объекты зомби
  • Вы сделали

Вкл в Xcode 7

<

или выберите Edit Scheme от Product > Scheme Меню

Выбрать Enable Zombie Objects сформировать Diagnostics табуляция

xcode 7 флаг зомби

В качестве альтернативы, если вы предпочитаете .xcconfig файлы, которые вы можете прочитать в этой статье https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/

Какао предлагает классную функцию, которая значительно расширяет ваши возможности для отладки таких ситуаций. Это переменная окружения, которая называется NSZombieEnabled, посмотрите это видео, которое объясняет настройку NSZombieEnabled в target-C

В Xcode > 4.3:

Вы щелкаете по раскрывающейся панели схемы -> изменить схему -> вкладку аргументов, а затем добавляете NSZombieEnabled в столбец Переменные среды и YES в столбец значения.

Удачи!!!

Другие вопросы по тегам