Как настроить NSZombieEnabled в Xcode 4?

456

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

Четан
источник
1
ты спрашиваешь о Xcode 4?
Джехия
8
Почему такие опции не включены по умолчанию, я не знаю ...
Даниэль Магнуссон,
26
Потому что это в основном предотвращает любое реальное освобождение памяти, которое не рекомендуется включать по умолчанию.
Четан
14
@ Даниэль Магнуссон: это самая выживаемая вещь. Делая разработку с XCode недружелюбной, но работоспособной, вы получаете лучших разработчиков. Просто шучу.
Дэн Розенстарк
3
@DanielMagnusson Я думаю, что это не плохая идея, AFAIK, режим «Зомби» изменит каждый объект на объект ob особого вида, чтобы он мог обнаруживать, когда он получает отправленные сообщения. Таким образом, включение «режима зомби» приведет к тому, что ни один объект никогда не будет освобожден, поэтому вы должны действительно использовать его только для устранения таких ошибок.
Беси

Ответы:

753

В 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» вручную в разделе «Переменные среды» на вкладке «Аргументы».

Яно
источник
27
Спасибо - мне было интересно, где они спрятали эти опции. Теперь я понимаю, что это то же самое окно, что и в меню «Редактировать схему».
emp
1
Просто чтобы добавить к этому, выполнение этого на экране «Выполнить» устанавливает для «Тест» также, если флажок «Использовать параметры действия Выполнить» установлен. Если вы хотите сделать это только для теста, этот флажок нужно снять
Кэмерон
1
Также обратите внимание, что эта опция появляется в Xcode 4.1 (верно?)
фи
2
В XCode 5 (и более поздних версиях 4 - 4.3.x наверняка, может быть, и раньше) это CMD-<( CMD-SHIFT-comma), илиProduct -> Scheme -> Edit SCheme...
Olie
1
Я застрял в странной проблеме EXC_BAD_ACCESS, даже зомби пропущены, было бы неплохо, если бы вы могли направить меня для этого stackoverflow.com/questions/29210057/…
Anoop Vaidya
70

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

learner2010
источник
57

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

  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. Вы получаете более подробный стек, который показывает вам, какими методами ваш поврежденный объект был выделен / освобожден или сохранен.

Besi
источник
1
Опция "Зомби" отсутствует в моем XCode 4, почему?
Ли Фумин
4
Убедитесь, что вы выбираете iOS Simulator > Allиз основного списка шаблонов (Вы можете сделать это только в симуляторе)
Besi
по какой-то причине ... если я выберу "зомби", он просто показывает распределение .. есть идеи, почему?
abbood
Это лучшее решение. Мне очень помогли :)
Михал Мищин
5

В Xcode 4.2

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

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

user2554822
источник
-1

В Xcode> 4.3:

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

Удачи !!!

Дипак Наригара
источник