Pergunta

Encontrei um problema com um aplicativo de dados principais do iPhone no qual estou trabalhando.Eu tenho uma tabela que lista objetos.Se eu selecionar um desses objetos, vou para um novo ViewController que mostra os detalhes do objeto.

Na visualização de detalhes, tenho um botão Voltar que me leva de volta à visualização de lista principal.

Posso selecionar qualquer número de linhas e isso me mostrará a visão detalhada de cada uma.No entanto, se eu tentar selecionar uma linha que já selecionei, ela travará com

Sinal recebido do programa:“EXC_BAD_ACCESS”.

Adicionei alguns pontos de interrupção e tentei rastrear isso, e encontrei o seguinte em meu método tableView cellForRowAtIndexPath ...

A primeira vez para cada objeto quando eu faço uma myEntity *thingamy = [fetchedResultScontroller objectAtindexpath: indexpath] Thingamy é válido e definido como uma coisa válida.No gdb, posso definir um ponto de interrupção neste ponto e fazer um

PO Thingamy e eu obtemos a saída esperada.

No entanto, na segunda vez que seleciono uma linha específica (por exemplo,selecione a linha 0, volte, selecione a linha 0 novamente), o thingamy não está configurado corretamente.

Posso visualizar qualquer número de outras linhas, mas assim que tento selecionar uma linha já visualizei os detalhes para que isso ocorra.

Se eu tiver o ponto de interrupção definido e tentar fazer um po thingamy depois de definido, obtenho o seguinte:

O programa recebeu sinal EXC_BAD_ACCESS, não foi possível acessar a memória.Razão:KERN_PROTECTION_FAILURE no endereço:0x00000020 0x92CA3ED7 em objc_msgsend ()

Alguma ideia de por que fetchedResultsController retorna um objeto válido na primeira chamada, mas não na segunda?

ATUALIZAR

Depois de alguns dias, tenho certeza de que não há problema com o fetchedResultsController sendo desalocado.Ativei o modo NSZombieEnabled e não há nada lá.

Além disso, posso obter outros objetos do fetchedREsultsController, mas não aquele que já acessei.

Por exemplo, eu posso obter [fetchedResultScontroller ObjectAtIndexpath: [NSIndexPath IndexPathForrow: 0 Inspeção: 0] e exibir isso na minha próxima visualização.

Quando eu revidar e voltar para minha visualização pai, posso obter o objeto em indexPathForRow:0 inSection:1 e exibi-lo.

Voltando ao início, tento obter indexPathForRow:0 inSection:0 e ele trava com EXC_BAD_ACCESS.

Em uma tabela com 100 linhas, posso obter cada linha uma vez, mas qualquer tentativa de obter a mesma linha duas vezes falha, mesmo que essas tentativas sejam uma após a outra.

Foi útil?

Solução 4

Finalmente encontrei a resposta para isso!

Na minha seção de desalocação, eu estava desalocando uma série de variáveis ​​em vez de liberá-las.Agora que mudei para release, tudo está funcionando conforme o esperado.

Outras dicas

Eu tive esse problema exato com um NSFetchedResultScontroller. Eu resolvi isso por Ligando nszombieenabled no xcode. No meu caso, acabou que eu estava liberando demais o NSFetchedResultScontroller.

Funcionou na primeira vez em que carreguei os dados, mas depois o estava lançando sem perceber. Na próxima vez em que divulguei a mesma instância que já havia lançado e isso falharia.

Se você continuar a ter problemas, publique seu código de inicialização NSFetchedResultSController.

Parece que, quando você volta, a lista foi realmente destruída e os ponteiros não fazem mais referência a endereços de memória válidos. Você tem algo que descarta a lista?

Você tem o seguinte método implementado?

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // In the simplest, most efficient, case, reload the table view.
    //[self.tableView reloadData];
}

Talvez jogue um ponto de interrupção lá e veja se o conteúdo está mudando? Dada a conversa NSFetchResultSController, achei que você poderia estar em um cenário em que isso poderia ajudar.

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