EXC_BAD_ACCESS quando si sposta l'app per iPhone dal simulatore 2.2 a 3.0
-
06-07-2019 - |
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
.
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?