Як встановити NSZombieEnabled в Xcode 4?


456

Як налаштувати NSZombieEnabledі CFZombieLevelдля свого виконуваного файлу в Xcode 4?


1
Ви питаєте про Xcode 4?
Ієхія

8
Чому такі опції не включені за замовчуванням, це поза мною ...
Даніель Магнуссон,

26
Тому що це в основному заважає реальному звільненню пам’яті, що за замовчуванням не здається гарною ідеєю.
Четан

14
@Daniel Magnusson: це виживання найкращого. Роблячи розвиток з XCode недоброзичливим, але працездатним, ви стаєте кращими розробниками. Просто шуткую.
Дан Розенстарк

3
@DanielMagnusson Я думаю, що це не погана ідея, AFAIK режим "Zombie" змінить кожен об'єкт на об'єкт спеціального виду, щоб він міг виявляти, коли йому надсилаються повідомлення. Так що включення "режиму зомбі" призведе до того, що жоден об'єкт ніколи не буде розміщений, тому вам слід реально використовувати його лише для вирішення таких помилок.
Бесі

Відповіді:


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 = ТАК" у розділі "Змінні середовища" вкладки Аргументи.


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 у стовпці Змінні середовища та ТАК у стовпці значень ...


57

Я вважаю цю альтернативу більш зручною:

  1. Натисніть "Запустити спадне меню"
  2. Зі списку виберіть Profile
  3. Програма "Інструменти" повинна відкритися там, де також можна вибрати Zombies
  4. Тепер ви можете взаємодіяти зі своїм додатком і намагатися викликати помилку
  5. Як тільки помилка трапиться, ви повинні отримати підказку, коли ваш об'єкт був звільнений і, отже, розміщений.

Зомбі

Як тільки виявляється зомбі, ви отримуєте акуратний "Zombie Stack", який показує вам, коли даний об’єкт був виділений і де він був збережений або випущений:

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. Ви отримуєте більш детальний стек, який показує, якими методами ваш корумпований об’єкт був виділений / звільнений або збережений.


1
У моєму XCode 4 відсутня опція "зомбі", чому?
Лі Фумін

4
Переконайтесь, що ви обираєте iOS Simulator > Allз основного списку шаблонів (це можна зробити лише в тренажері)
Бесі

чомусь .. якщо я вибираю "зомбі", він просто показує виділення .. будь-яка ідея, чому?
абат

Це найкраще рішення. Мені дуже допомогли :)
Michał Miszczyszyn

5

У Xcode 4.2

  • Назва проекту / Редагувати схему / Діагностика /
  • Включити об'єкти зомбі
  • Ви закінчили


1

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


-1

У Xcode> 4.3:

Ви клацаєте на спадному рядку схеми -> редагувати схему -> вкладку аргументів, а потім додаєте NSZombieEnabled у стовпці "Змінні середовища" та "ТАК" у стовпці "Значення".

Щасти !!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.