Eu vi sugestões dizendo para definir NSZombieEnabled
como true
durante a depuração. O que é NSZombie? É uma estrutura? Uma configuração?
Eu vi sugestões dizendo para definir NSZombieEnabled
como true
durante a depuração. O que é NSZombie? É uma estrutura? Uma configuração?
Respostas:
É um auxiliar de depuração de memória. Especificamente, quando você define NSZombieEnabled
then, sempre que um objeto atinge reter a contagem 0, em vez de ser desalocado, ele se transforma em uma NSZombie
instância. Sempre que esse tipo de zumbi recebe uma mensagem, ele registra um aviso em vez de travar ou se comportar de maneira imprevisível. Como tal, você pode depurar problemas sutis de liberação / liberação automática sem ferramentas avançadas ou agulha meticulosa em pesquisas de palheiro.
O nome é uma brincadeira bastante óbvia com o fato de que os objetos são normalmente considerados "mortos" quando alcançam a contagem 0. Com essa configuração, eles continuam a existir em uma meia-vida estranha - nem vivos, nem totalmente mortos. Muito parecido com zumbis reais, exceto que eles comem menos cérebros.
Adam fez um ótimo trabalho explicando o que são zumbis, mas usar a variável de ambiente não é a melhor maneira de encontrá-los e rastreá-los.
Uma abordagem muito melhor para detecção de zumbis é apenas usar instrumentos - a partir do XCode, comece com "Executar com instrumento" e escolha "Alocações".
Em seguida, pare a gravação logo após o início, pressione o botão "i" no instrumento de alocações e ative "habilitar contagens de referência" e "Habilitar detecção de NSZombie". Agora pressione Gravar novamente no instrumento e seu aplicativo será iniciado - se algum objeto zumbi for enviado, a gravação de mensagens será interrompida e uma caixa de diálogo aparecerá na linha do tempo de gravação - você pode clicar nela para encontrar todos os lugares onde um objeto estava retidos ou liberados.
Edit: O conselho anterior era para o XCode 3, aqui está uma adição para o XCode 4:
No XCode 4.2 , há um mecanismo ainda mais fácil de usar a detecção de zumbis - o instrumento zumbi. Em vez de "Executar" para iniciar o aplicativo, use "Perfil" e um seletor de instrumento aparecerá. Selecione "Zombie" e o aplicativo começará a ser executado - faça o que quer que cause a sua falha, uma caixa de diálogo aparecerá dizendo "Zombie Messaged".
A partir daí, clique na pequena seta na caixa de diálogo. Isso levará a uma lista de todas as vezes que o objeto zumbi foi criado, retido ou liberado. Puxe a barra lateral para cima e você pode ir para cada entrada, observando o rastreamento de pilha do código que foi responsável por cada ajuste na contagem de retenção.
Concordo com o que Kendall adicionou, é muito útil, mas vou sugerir ainda fazer a variável de ambiente para que você não esqueça que estão habilitadas. Semelhante ao link (agora expirado) no Cocoa Dev, coloquei este link para não perder:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
Chama minha atenção muito bem.
Ajudaria alguém.
Documento detalhado sobre instrumentos. https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1