Pergunta

Bem, eu tinha um aplicativo que estava desenvolvendo no iPhone SDK 2.2 e recentemente o construí e o lançou no simulador 3.0. O SDK base ainda está definido como 2.2. Achei que isso evitaria problemas. Em vez disso, entendo

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x92f4b688 objc_msgSend + 24
1   Foundation                      0x305085bd -[NSCFString isEqualToString:] + 61
2   HappyApp                        0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)

O acidente está ocorrendo em uma linha muito simples, onde total é um UITextField

if (![total.text isEqualToString:@""] ) {

Alguém encontrou isso? Eu sinto que é um problema de contenção de threads, ou todo o meu aplicativo não está compilando corretamente. Funciona no simulador 2.2.1. Se isso não for a maneira de testar um aplicativo 2.2 no OS 3.0, o que devo fazer além de alternar a caixa suspensa?

Atualizar: Andrew Pouliot estava certo, pois essa era uma questão de referência liberada. O depurador estava apontando uma linha para que eu recebi as dicas erradas. O culpado foi realmente esta primeira linha:

if(!([total.text isEqual:totalTextCache]
  && [divisions.text isEqual:divisionsTextCache])) {
  //Loads the data for the table only if the values were actually changed
  totalTextCache = total.text; //ditto for divisions
}

Essas linhas são os únicos usos de totalTextCache, e tornou -se inválido se total.text foi alterado. Isso nunca causou um problema no 2.2.1 sim provavelmente porque o velho total.text nunca foi lançado pelo tempo de execução quando mudou o valor. Mas esse código estava errado. Eu consertei mudando para fazer exatamente o que eu pensava que o ISequal estava fazendo:

if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))

Porque eu realmente não queria copiar o NSStrings, mas verifique se eles haviam mudado (e, portanto, a referência teria mudado, isso funciona. O código ruim funcionou bem no tempo de execução 2.2.1, porque a referência antiga ainda pode ter sua propriedade de hash verificada e comparada por isEqual.

Foi útil?

Solução

Quando instalei meu 3.0 SDK, minhas ferramentas 2.0 foram embora, por isso não tenho certeza se isso é aplicável, mas não acho que as compilações do simulador sejam projetadas para serem compatíveis binários para futuros tempos de execução.

É provável que o problema esteja no seu código. Nesse caso, posso dizer que você tem um problema de gerenciamento de memória e não "contenção de threads". Tudo acontece no segmento principal do UIKIT (não segura de threads).

Verifique onde você configura sua variável total; Provavelmente já foi lançado quando você atinge esse método. Certifique -se de que seu retenção seja sensato.

Você tem o mesmo erro ao criar para 3.0?

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