O que é NSZombie?

97

Eu vi sugestões dizendo para definir NSZombieEnabledcomo truedurante a depuração. O que é NSZombie? É uma estrutura? Uma configuração?

Moshe
fonte
18
Um NSObject morto-vivo - cuidado!
vikingosegundo
5
Um * NSObject morto-vivo.
Alex Zavatone

Respostas:

191

É um auxiliar de depuração de memória. Especificamente, quando você define NSZombieEnabledthen, sempre que um objeto atinge reter a contagem 0, em vez de ser desalocado, ele se transforma em uma NSZombieinstâ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 Wright
fonte
61
Tenha o cuidado de remover essa configuração quando terminar a depuração, porque essencialmente vaza todos os objetos.
Justin
1
Obrigado por esta explicação simples. Vamos informar que Cocoa Dev Link não está mais funcionando. 1 para breve e direto ao ponto.
CRDave de
95

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.

Kendall Helmstetter Gelner
fonte
2
Este é um conselho extremamente útil.
w.donahue
4
Eu atualizei a resposta para o XCode 4, pois torna ainda mais fácil fazer a detecção de zumbis em instrumentos.
Kendall Helmstetter Gelner
Na verdade não, deve funcionar da mesma forma com o XCode 5 e 6.
Kendall Helmstetter Gelner
2
Também posso confirmar isso com o XCode 7.2
Beat
31

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.

Matthew Frederick
fonte