Что такое NSZombie?

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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