EXC_BAD_ACCESS Ao mover o aplicativo para iPhone de 2.2 para 3.0 simulador
-
06-07-2019 - |
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 NSString
s, 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
.
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?