Domanda

Beh, avevo un'app che stavo sviluppando in iPhone SDK 2.2 e di recente l'ho costruita e lanciata nel simulatore 3.0. L'SDK di base è ancora impostato su 2.2. Ho pensato che avrebbe evitato problemi. Invece ottengo

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)

L'arresto anomalo si verifica su una riga molto semplice, in cui total è un UITextField

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

Qualcuno l'ha riscontrato? Sento che si tratta di un problema di discussione, o che la mia intera app non si sta compilando correttamente. Funziona nel simulatore 2.2.1. Se questo non risulta essere il modo per testare un'app 2.2 in OS 3.0, cosa dovrei fare se non cambiare quella casella a discesa?

Aggiornamento : Andrew Pouliot aveva ragione sul fatto che si trattava di un problema di riferimento rilasciato. Il debugger stava indicando una riga in modo da avere i suggerimenti sbagliati. Il colpevole era in realtà questa prima riga:

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
}

Queste righe sono gli unici usi di totalTextCache e sono diventate non valide se total.text è stato modificato. Ciò non ha mai causato problemi nella simulazione 2.2.1 probabilmente perché il vecchio total.text non è mai stato rilasciato dal runtime quando ha cambiato valore. Ma questo codice era sbagliato. L'ho risolto cambiandolo per fare esattamente quello che pensavo facesse Equal:

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

Perché in realtà non volevo copiare i NSString , ma controlla solo se sono cambiati (e quindi il riferimento sarebbe cambiato, questo funziona. Il codice errato è andato bene nel 2.2.1 runtime perché al vecchio riferimento potrebbe ancora essere controllata la proprietà hash e confrontata con isEqual .

È stato utile?

Soluzione

Quando ho installato il mio SDK 3.0, i miei strumenti 2.0 sono scomparsi, quindi non sono sicuro che sia applicabile, ma non credo che le build del simulatore siano progettate per essere binarie compatibili con i runtime futuri.

È probabile che il problema risieda nel codice. In tal caso, posso dire che hai un problema di gestione della memoria e non "contesa sui thread". Tutto accade sul thread principale in UIKit (non thread-safe).

Verifica dove hai impostato la variabile totale; probabilmente è già stato rilasciato quando hai scelto questo metodo. Assicurati che il tuo retainCount sia ragionevole.

Hai lo stesso errore quando crei per 3.0?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top