EXC_BAD_ACCESS al mover la aplicación de iPhone del simulador 2.2 a 3.0
-
06-07-2019 - |
Pregunta
Bueno, tenía una aplicación que estaba desarrollando en iPhone SDK 2.2 y recientemente la construí y la lancé en el simulador 3.0. El SDK base todavía está configurado en 2.2. Supuse que eso evitaría problemas. En cambio, obtengo
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)
El bloqueo se produce en una línea muy simple, donde total
es un UITextField
if (![total.text isEqualToString:@""] ) {
¿Alguien ha encontrado esto? Siento que es un problema de disputa de hilos, o que toda mi aplicación no se está compilando correctamente. Funciona en el simulador 2.2.1. Si resulta que esta no es la forma de probar una aplicación 2.2 en OS 3.0, ¿qué debo hacer además de cambiar ese cuadro desplegable?
Actualización : Andrew Pouliot tenía razón en que se trataba de un problema de referencia publicado. El depurador estaba señalando una línea, así que recibí las pistas equivocadas. El culpable fue en realidad esta primera línea:
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
}
Estas líneas son los únicos usos de totalTextCache
, y no serán válidas si se cambia total.text
.
Esto nunca causó un problema en la sim 2.2.1 probablemente porque el antiguo total.text
nunca fue lanzado por el tiempo de ejecución cuando cambió el valor. Pero este código estaba mal. Lo arreglé cambiándolo para que hiciera exactamente lo que pensaba que estaba haciendo Equal:
if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))
Debido a que en realidad no quería copiar los NSString
s, pero simplemente verifique si habían cambiado (y, por lo tanto, la referencia habría cambiado, esto funciona. El código incorrecto funcionó bien en el 2.2.1 tiempo de ejecución porque la referencia anterior aún podría tener su propiedad hash verificada y comparada por isEqual
.
Solución
Cuando instalé mi SDK 3.0, mis herramientas 2.0 desaparecieron, así que no estoy seguro de si esto es aplicable, pero no creo que las compilaciones de simuladores estén diseñadas para ser compatibles con binarios en tiempos de ejecución futuros.
Sin embargo, es probable que el problema se encuentre en su código. Si es así, puedo decir que tiene un problema de administración de memoria y no `` contención de subprocesos ''. Todo sucede en el hilo principal en UIKit (no es seguro para hilos).
Verifique dónde configuró su variable total; Probablemente ya se haya lanzado cuando llegue a este método. Asegúrate de que retieneCount es razonable.
¿Tiene el mismo error cuando compila para 3.0?