Pergunta

Quando eu set NSZombieEnabled = Yes nada é escrito para o console. Como posso consertar isso? Ou você pode me aconselhar quaisquer outras ferramentas para uma EXC_BAD_ACCESS?

Foi útil?

Solução

Você tem um acidente velho liso. meios EXC_BAD_ACCESS que seu pedido tenha tentou acessar um endereço de memória que é inválido. Embora a razão típica maioria para isso em um aplicativo Objective-C não GC'd é messaging um objeto depois deallocation, algo que detecta Zombie Mode, este acidente particular pode acontecer a qualquer número de outras maneiras (como demonstrado).

Uma vez que a sua aplicação está falhando, você deve ter um registo de chamadas. Você precisa postar que backtrace aqui para qualquer um de nós para ser capaz de ajudá-lo.

Como Brad disse, execute o aplicativo com a depuração habilitada. No Xcode, você encontrará o item de menu "Run / Debug" no menu "Run". Use essa. Quando seu aplicativo falha, você deve ver um rastreamento de pilha no canto superior esquerdo da janela do depurador.

Não, realmente, eles aparecem no depurador. Uma imagem vale 1.000 palavras. text alt
(fonte: friday.com )

Outras dicas

"EXC_BAD_ACCESS" não está necessariamente relacionado a uma instância zumbi. Ele pode ser ligado um acesso a uma referência indefinida, como uma variável local.

NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error

Editar: bandeira NSZombie só irá ajudá-lo a resolver o "EXC_BAD_ACCESS" desencadeada pelo uso de uma instância de-alocado.

A fim de resolver os erros, você tem que usar o registo de chamadas do acidente para identificar a localização que está errado. Então, vá para trás em seu código e verificar cada atribuição e alocações.

Certifique-se também inicializar todos os ponteiros para nil antes de usá-los!

Se você usar um ponteiro sem inicializa-la a zero ou qualquer outro objeto, você propably vai acabar acessando a memória que não é seu.

Por exemplo, o seguinte código irá também dar um EXC_BAD_ACCESS que não é rastreável usando a bandeira NSZombieEnabled causada pela última linha.

RecordingLocation* closest;

//find the closest recording location
for (...)
{
    //try to find the closest object...
    //suppose we don't find anything so closest is never set.
}

if (closest!=nil)
    NSLog(@"Closest: %f,%f",closest.x,closest.y);

Eu não entendo como a resposta a esta pergunta realmente responde à pergunta ..

eu estou me perguntando a mesma coisa. usando xcode4 i permitiram NSZobmieEnabled = YES para parar quando eu acessar um objeto que foi lançado, em vez de bater com EXC_BAD_ACCESS -. que é muito útil

a questão em apreço foi:

"Quando eu definir NSZombieEnabled = Yes nada é escrito para o console. Como posso corrigir isso ...".

simples e direta.

eu estou enfrentando o mesmo problema. paradas Xcode com o depurador, mas o console não produz nenhuma mensagem. eu esperaria algo ao longo das linhas de:

"mensagem enviada a instância desalocada ...".

É você busca Stack Overflow para EXC_BAD_ACCESS , você vai encontrar um número de pessoas com a mesmo problema que você tem. A grande maioria das vezes que você acertar isso, você está encontrando problemas de memória. Se você está seguindo o protocolo descrito aqui ou aqui , e você não está vendo nenhum relato de mensagens sendo enviadas a objetos lançados no console, pode ser algo diferente.

Você tentou iniciar a aplicação no depurador (Run | Debug - Pontos de interrupção On)? Assim que você acertar o EXC_BAD_ACCESS, o depurador deve parar. Se você olhar para o registo de chamadas exibido no depurador. (Run | Debugger), pode mostrar onde ocorreu o erro

Como eu passei apenas um feliz 20 minutos olhando para isso com NSZombieEnabled não trabalhar, eu pensei em adicionar isso irá causar um EXC_BAD_ACCESS

NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];

Observe os desaparecidos '@' no segundo param. Eu não fez: -)

Eu tive uma experiência diferente com EXC_BAD_ACCESS, então eu gostaria de compartilhar.

Como indicado nas perguntas, embora NSZombieEnabled foi verificada, nada foi escrito para o console. Depois de várias horas de luta no simulador, decidi instalá-lo para o dispositivo. A mensagem de erro que eu tenho de depuração com o dispositivo era mais útil.

Por fim, percebi que eu estava recebendo erro EXC_BAD_ACCESS e comportamento estranho porque eu renomeado um par de arquivos xib um dia antes. Selecionei o objeto 'View Controller' para arquivo MainWindow.xib e corrigido o NIB Nome propriedade. Então, tudo funcionou sem problemas.

Eu acho que Nem todo EXC_BAD_ACCESS é encontrado por NSZombie Ativando ..
Porque alguns casos eu também não estou recebendo resultado ao usar zumbi ..
Acho que só EXC_BAD_ACCESS relacionadas com o uso de objeto lançado pode ver, permitindo zumbi.

E mais uma questão que observou durante a utilização zumbi é: Às vezes também causar falhas na depuração. Um caso que eu peguei caiu, mostrando:
*** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
Isso só acontece quando permitindo NSZombie.

O que estou fazendo é, On
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
Eu libero o objeto atual "MagazineWebview" e carregar o dado [pedido de URL] em outro objeto "MagazineWebview". Para achiving minha algumas funcionalidades ...

graças

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top