Como faço para configurar o NSZombieEnabled no Xcode 4?

456

Como configuro NSZombieEnablede CFZombieLevelpara o meu executável no Xcode 4?

Chetan
fonte
1
você está perguntando sobre o Xcode 4?
9189
8
Por que opções como este não está habilitado por padrão está além de mim ...
Daniel Magnusson
26
Porque basicamente impede qualquer liberação real de memória, o que não parece uma boa ideia para ativar por padrão.
Chetan 29/07
14
@ Daniel Magnusson: é uma coisa de sobrevivência do mais forte. Ao tornar o desenvolvimento com o XCode hostil, mas viável, você obtém melhores desenvolvedores. Só brincando.
Dan Rosenstark
3
@DanielMagnusson Eu acho que isso não é uma má idéia. AFAIK, o modo "Zumbi", mudará todos os objetos para um tipo especial de objeto ob, para que ele possa detectar quando receber mensagens. Portanto, ter o "Modo Zumbi" ativado fará com que nenhum objeto seja desalocado; portanto, você realmente deve usá-lo apenas ao lidar com esses erros.
Besi

Respostas:

753

No Xcode 4.x, pressione

R

(ou clique em Menubar> Product> Scheme> Edit Scheme)

selecione a guia "Diagnóstico" e clique em "Ativar objetos zumbis":

Clique em "Ativar objetos zumbis"

Isso transforma objetos liberados em instâncias do NSZombie que imprimem avisos do console quando usados ​​novamente. Este é um auxiliar de depuração que aumenta o uso da memória (nenhum objeto é realmente lançado), mas melhora o relatório de erros.

Um caso típico é quando você libera um objeto em excesso e não sabe qual:

  • Com zumbis: -[UITableView release]: message sent to deallocated instance
  • Sem zumbis: EXC_BAD_ACCESS

Essa configuração do Xcode é ignorada quando você arquiva o aplicativo para envio da App Store. Você não precisa tocar em nada antes de liberar seu aplicativo.

Pressionar Ré o mesmo que selecionar Produto> Executar enquanto mantém a Alttecla pressionada.
Clicar na caixa de seleção "Ativar objetos zumbis" é o mesmo que adicionar manualmente "NSZombieEnabled = YES" na seção "Variáveis ​​de ambiente" da guia Argumentos.

Jano
fonte
27
Obrigado - eu queria saber onde eles ocultaram essas opções. Agora percebo que essa é a mesma janela do menu 'Editar esquema'.
emp
1
Apenas para adicionar isso, fazê-lo na tela "Executar" o define para "Teste" e também se a caixa "Usar as opções da ação Executar" estiver marcada. Se você quiser fazê-lo por apenas Teste, que a caixa precisa ser desmarcada
Cameron
1
Observe também que esta opção aparece no Xcode 4.1 (certo?)
phi
2
No XCode 5 (e versões posteriores do 4 - 4.3.x, com certeza, talvez antes), isso é CMD-<( CMD-SHIFT-comma), ouProduct -> Scheme -> Edit SCheme...
Olie
1
Eu estou preso em questão EXC_BAD_ACCESS estranho, até mesmo os Zombies são ignorados, seria bom se você pudesse me dirigir para este stackoverflow.com/questions/29210057/...
Anoop Vaidya
70

A resposta de Jano é a maneira mais fácil de encontrá-lo. Outra maneira seria se você clicar na barra suspensa do esquema -> editar esquema -> guia argumentos e depois adicionar NSZombieEnabled na coluna Variáveis ​​de ambiente e YES na coluna Valor ...

learner2010
fonte
57

Acho essa alternativa mais conveniente:

  1. Clique no botão "Executar botão suspenso"
  2. Na lista, escolha Profile
  3. O programa "Instrumentos" deve abrir, onde você também pode escolher Zombies
  4. Agora você pode interagir com seu aplicativo e tentar causar o erro
  5. Assim que o erro ocorrer, você deve saber quando seu objeto foi lançado e, portanto, desalocado.

Zumbis

Assim que um zumbi é detectado, você recebe uma "Pilha de zumbis" que mostra quando o objeto em questão foi alocado e onde foi retido ou liberado:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Vantagens em comparação ao uso da guia de diagnóstico dos esquemas Xcode :

  1. Se você esquecer de desmarcar a opção na guia Diagnóstico, nenhum objeto será liberado da memória.

  2. Você obtém uma pilha mais detalhada que mostra em quais métodos seu objeto corrompido foi alocado / liberado ou retido.

Besi
fonte
1
A opção "Zumbis" está ausente no meu XCode 4, por quê?
Li Fumin
4
Certifique-se de que você está escolhendo iOS Simulator > Alla partir da lista de modelos principal (Você só pode fazer isso no simulador)
Besi
por alguma razão .. se eu selecionar 'zumbis', ele só mostra alocações .. alguma idéia por que?
abbood
essa é a melhor solução. Me ajudou muito :)
Michał Miszczyszyn
5

No Xcode 4.2

  • Nome do Projeto / Editar Esquema / Diagnósticos /
  • Caixa de seleção Ativar objetos zumbis
  • Você Terminou
pratap shaik
fonte
1

O cacau oferece um recurso interessante que aprimora muito seus recursos para depurar essas situações. É uma variável de ambiente chamada NSZombieEnabled, assista a este vídeo que explica a configuração do NSZombieEnabled no objetivo-C

user2554822
fonte
-1

No Xcode> 4.3:

Você clica na barra suspensa do esquema -> editar esquema -> guia argumentos e adiciona NSZombieEnabled na coluna Variáveis ​​de ambiente e YES na coluna Valor.

Boa sorte !!!

Dipak Narigara
fonte