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 .

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top