Что такое NSZombie?

97

Я видел предложения, в которых говорилось, что нужно установить NSZombieEnabledво trueвремя отладки. Что такое NSZombie? Это фреймворк? Настройка?

Моше
источник
18
Нежить NSObject - будьте осторожны!
vikingosegundo
5
* Нежить NSObject.
Alex Zavatone 06

Ответы:

192

Это средство отладки памяти. В частности, когда вы устанавливаете NSZombieEnabledthen, всякий раз, когда объект достигает счетчика сохранения 0, вместо того, чтобы освобождаться, он трансформируется в NSZombieэкземпляр. Каждый раз, когда такой зомби получает сообщение, он регистрирует предупреждение, а не дает сбой или ведет себя непредсказуемым образом. Таким образом, вы можете отлаживать тонкие проблемы чрезмерного выпуска / автоматического выпуска без дополнительных инструментов или кропотливой иглы в поисках стога сена.

Название является довольно очевидной игрой на том факте, что объекты обычно считаются «мертвыми», когда они достигают сохраненного счетчика 0. С этой настройкой они продолжают существовать в странном периоде полураспада - ни живые, ни совсем мертвые. Очень похоже на настоящих зомби, за исключением того, что они едят гораздо меньше мозгов.

Адам Райт
источник
61
Будьте осторожны, чтобы удалить этот параметр, когда закончите отладку, потому что он, по сути, приводит к утечке каждого объекта.
Джастин
1
Спасибо за это простое объяснение. Сообщаем, что Cocoa Dev Link больше не работает. +1 для краткости и по существу.
CRDave
95

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

Намного лучший подход к обнаружению зомби - просто использовать инструменты - в XCode начните с «Run with Instrument» и выберите «Allocations».

Затем остановите запись сразу после ее начала, нажмите кнопку «i» на инструменте распределения и включите «включить счетчик ссылок» и «включить обнаружение NSZombie». Теперь снова нажмите «Запись» в инструменте, и ваше приложение запустится - если будут отправлены какие-либо зомби-объекты, запись сообщений остановится, и на шкале времени записи появится диалоговое окно - вы можете щелкнуть по нему, чтобы найти каждое место, где находился объект. сохранены или освобождены.

Изменить: предыдущий совет был для XCode 3, вот дополнение для XCode 4:

В XCode 4.2 есть еще более простой механизм использования обнаружения зомби - инструмент зомби. Вместо «Выполнить» для запуска приложения используйте «Профиль», и появится селектор инструментов. Выберите «Zombie», и приложение запустится - делайте все, что вызывает сбой, появится диалоговое окно с надписью «Zombie Messaged».

Оттуда щелкните маленькую стрелку в диалоговом окне. Это приведет к списку всех случаев создания, сохранения или освобождения зомби-объекта. Потяните вверх боковую панель, и вы можете перейти к каждой записи, глядя на трассировку стека для кода, который отвечал за каждую корректировку в счетчике удержания.

Кендалл Хельмштеттер Гельнер
источник
2
Это невероятно полезный совет.
w.donahue
4
Я обновил ответ для XCode 4, так как он упрощает обнаружение зомби в инструментах.
Кендалл Хельмштеттер Гельнер,
Не совсем, должно работать примерно так же с XCode 5 и 6.
Кендалл Хельмштеттер Гельнер
2
Я также могу подтвердить это с помощью XCode 7.2
Beat
31

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

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

Это очень хорошо привлекает мое внимание.

Мэтью Фредерик
источник