Я видел предложения, в которых говорилось, что нужно установить NSZombieEnabled
во true
время отладки. Что такое NSZombie? Это фреймворк? Настройка?
Я видел предложения, в которых говорилось, что нужно установить NSZombieEnabled
во true
время отладки. Что такое NSZombie? Это фреймворк? Настройка?
Ответы:
Это средство отладки памяти. В частности, когда вы устанавливаете NSZombieEnabled
then, всякий раз, когда объект достигает счетчика сохранения 0, вместо того, чтобы освобождаться, он трансформируется в NSZombie
экземпляр. Каждый раз, когда такой зомби получает сообщение, он регистрирует предупреждение, а не дает сбой или ведет себя непредсказуемым образом. Таким образом, вы можете отлаживать тонкие проблемы чрезмерного выпуска / автоматического выпуска без дополнительных инструментов или кропотливой иглы в поисках стога сена.
Название является довольно очевидной игрой на том факте, что объекты обычно считаются «мертвыми», когда они достигают сохраненного счетчика 0. С этой настройкой они продолжают существовать в странном периоде полураспада - ни живые, ни совсем мертвые. Очень похоже на настоящих зомби, за исключением того, что они едят гораздо меньше мозгов.
Адам отлично объяснил, что такое зомби, но использование переменной окружения - не лучший способ их найти и отследить.
Намного лучший подход к обнаружению зомби - просто использовать инструменты - в XCode начните с «Run with Instrument» и выберите «Allocations».
Затем остановите запись сразу после ее начала, нажмите кнопку «i» на инструменте распределения и включите «включить счетчик ссылок» и «включить обнаружение NSZombie». Теперь снова нажмите «Запись» в инструменте, и ваше приложение запустится - если будут отправлены какие-либо зомби-объекты, запись сообщений остановится, и на шкале времени записи появится диалоговое окно - вы можете щелкнуть по нему, чтобы найти каждое место, где находился объект. сохранены или освобождены.
Изменить: предыдущий совет был для XCode 3, вот дополнение для XCode 4:
В XCode 4.2 есть еще более простой механизм использования обнаружения зомби - инструмент зомби. Вместо «Выполнить» для запуска приложения используйте «Профиль», и появится селектор инструментов. Выберите «Zombie», и приложение запустится - делайте все, что вызывает сбой, появится диалоговое окно с надписью «Zombie Messaged».
Оттуда щелкните маленькую стрелку в диалоговом окне. Это приведет к списку всех случаев создания, сохранения или освобождения зомби-объекта. Потяните вверх боковую панель, и вы можете перейти к каждой записи, глядя на трассировку стека для кода, который отвечал за каждую корректировку в счетчике удержания.
Я согласен с тем, что добавил Кендалл, это очень полезно, но я предлагаю по-прежнему делать переменную среды, чтобы вы не забыли, что они включены. Подобно ссылке (срок действия которой истек) в Cocoa Dev, я поместил это, чтобы не пропустить:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
Это очень хорошо привлекает мое внимание.
Помогло бы кому-нибудь.
Подробный документ по приборам. https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1