Що таке NSZombie?


97

Я бачив пропозиції про те, щоб встановити NSZombieEnabledна trueпід час налагодження. Що таке NSZombie? Це рамки? Налаштування?


18
Нежить NSObject - стережіться!
vikingosegundo

5
* Нежитий об'єкт NSO.
Alex Zavatone

Відповіді:


191

Це допоміжний засіб для налагодження пам'яті. Зокрема, коли ви встановлюєте, NSZombieEnabledтоді, коли об’єкт досягає збереження рахунку 0, а не вивільнення, він перетворюється на NSZombieекземпляр. Всякий раз, коли такий зомбі отримує повідомлення, він реєструє попередження, а не збивається або поводиться непередбачувано. Таким чином, ви можете налагодити тонкі проблеми надмірного випуску / автоматичного випуску без вдосконалених інструментів або копіткої голки під час пошуку копиць сіна.

Назва є досить очевидною грою на тому, що об'єкти, як правило, вважаються "мертвими", коли вони досягають утримують кількість 0. При такому налаштуванні вони продовжують існувати в дивному періоді напіввиведення - ні живих, ні зовсім мертвих. Наче схожі на справжніх зомбі, за винятком того, що вони їдять набагато менше мізків.


61
Будьте обережні, щоб видалити цей параметр, коли ви закінчите налагодження, оскільки він по суті протікає кожному об'єкту.
Джастін

1
Дякую за це просте пояснення. Повідомте про те, що Cocoa Dev Link більше не працює. +1 коротко і до точки.
CRDave

95

Адам чудово пояснив, що таке зомбі, але використання змінної середовища - не найкращий спосіб їх знайти та відстежити.

Набагато кращий підхід до виявлення зомбі - це просто використовувати інструменти - від XCode починайте з "Запустити з інструментом" і виберіть "Розподіл".

Потім зупиніть запис відразу після її запуску, натисніть кнопку «i» на інструменті «Виділення» та увімкніть «Увімкнути підрахунки еталонів» та «Увімкнути виявлення NSZombie». Тепер знову натисніть «Записати» в інструменті, і ваш додаток запуститься - якщо надіслані будь-які зомбі-об’єкти, запис припиниться, а на хронології запису з’явиться діалогове вікно - ви можете натиснути на нього, щоб знайти кожне місце, де був об’єкт утримується або звільняється.

Редагувати: попередня порада стосувалася XCode 3, ось додаток до XCode 4:

У XCode 4.2 є ще простіший механізм використання системи виявлення зомбі - інструменту зомбі. Замість запуску програми використовуйте «Профіль» і вийде інструмент вибору інструментів. Виберіть "Zombie", і додаток почне працювати - зробіть все, що спричинить ваш збій, з'явиться діалогове вікно із повідомленням "Повідомлення зомбі".

Звідти натисніть на стрілку в діалоговому вікні. Це займе перелік усіх часів, коли об’єкт зомбі створювався, зберігався чи випускався. Підніміть бічну панель і ви можете перейти до кожного запису, переглянувши слід стека для коду, який відповідав за кожне коригування у рахунку збереження.


2
Це неймовірно корисна порада.
w.donahue

4
Я оновив відповідь на XCode 4, оскільки це ще простіше робити виявлення зомбі в інструментах.
Kendall Helmstetter Gelner

Насправді, слід працювати майже так само з XCode 5 і 6.
Кендалл Гельмстерт Гельнер

2
Я також можу підтвердити, що з XCode 7.2
Beat

31

Я погоджуюся з тим, що додав Кендалл, це дуже корисно, але я пропоную все-таки зробити змінну середовища, щоб ви не забували, що вони включені. Подібно до посилання (що втратила чинність) у Cocoa Dev, я поклав це, щоб не пропустити:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

Це дуже приваблює мою увагу.


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