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


456

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


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.


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 ...


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.


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


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


-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 !!!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.