17

Seguimos obteniendo un accidente aleatorio, extraño con NSDateFormatter. El seguimiento de la pila es relevante:NSDateFormatter se bloquea cuando se utiliza desde diferentes hilos

Program received signal: “EXC_BAD_ACCESS”. 
#0 0x00000005 in ??() 
#1 0x0213e3c3 in udat_parse() 
#2 0x01d4e1ca in CFDateFormatterGetAbsoluteTimeFromString() 
#3 0x01d4e225 in CFDateFormatterCreateDateFromString() 
#4 0x003e2608 in getObjectValue() 
#5 0x003e2921 in -[NSDateFormatter getObjectValue:forString:errorDescription:]() 
#6 0x003e21cd in -[NSDateFormatter dateFromString:]() 

La fecha formateador se encuentra todavía en la memoria (es decir, no se libera o dañado). Lo único que se me ocurre es que las cadenas en el momento del bloqueo no se ajustan al formato, pero dudo que el formateador se bloquee por completo. (No es trivial verificar el formato de antemano).

¿Alguna idea?

Respuesta

43

Gracias a los contestadores previos.

Esto no era un problema de memoria. Resultó ser un problema de sincronización. NSDateFormatter s no son seguros para subprocesos; había un hilo de fondo que intentaba usar el mismo formateador al mismo tiempo (de ahí la aleatoriedad).

Espero que esto ayude a alguien en el futuro!

+0

gracias me ayudó: D el mismo problema y solo ocurría al azar, muchas gracias. –

+1

entonces, ¿cómo lo arreglaste? – user102008

+3

Me aseguré de que cada subproceso tuviera acceso a su propio NSDataFormatter. Si no le preocupa la contención, probablemente solo pueda agregar '@synchronized (dateFormatter) {...}' alrededor del código que lo usa. – jbenet

1

EXCBADACCESS ocurrirá cuando se utiliza cualquier objeto desasignado ... intenta utilizar NSZombie .. Es una manera fácil de encontrar dónde se produce el EXCBADACCESS ... Será especificar el método de dónde y qué objeto se cancela la asignación

Ver este vínculo http://www.markj.net/iphone-memory-debug-nszombie/

+1

EXC_BAD_ACCESS no solo se produce en objetos desasignados. Significa cualquier mal acceso a la memoria (¡como una segfault!). Claro, en la mayoría de los casos, los problemas de memoria del iPhone son excesivos, pero en este caso resultó ser un problema de sincronización: los punteros estaban siendo modificados por diferentes subprocesos que llevaban a una desmarcación de punteros falsos. – jbenet

+0

gracias por intentar ayudar :) – jbenet

1

Mi apuesta es que la cadena que pasa en el formateador de fecha es exagerada.

+0

Lo comprobé muchas veces. Tanto el formateador como la cadena no se liberan en exceso. Resultó ser un problema de sincronización. – jbenet

3

Otra solución sería serializar la ejecución del código que usa NSDateFormatter s, o cualquier otro objeto no seguro para subprocesos. El uso de Grand Central Dispatch puede empujar el código de la main_queue:

dispatch_async(dispatch_get_main_queue(), ^(void){ 
    [some_object some_message]; 
}); 

o utilizar una cola privada para lograr el mismo efecto:

dispatch_queue_t dispatch_queue = dispatch_queue_create("com.MyApp.serializer",NULL); 
dispatch_async(dispatch_queue, ^(void){ 
    [some_object some_message]; 
}); 
+0

Después de la prueba de rendimiento, esta solución resulta DOS VECES tan rápido en mi implementación (simple) como el uso de almacenamiento local de subprocesos. La prueba de rendimiento llama 'stringFromDate:' desde múltiples hilos. – Berik

1

que estaba experimentando los accidentes extraños con _sigtramp que causaron a la aplicación de aparecen bloqueados pero todavía en la pantalla, obstruyendo por completo la causa real.

Resultó que introdujimos el análisis de datos multihilo que colisionó con el hilo principal de la GUI tratando de analizar las fechas usando NSDateFormatter.

Poner un poco de sincronización alrededor del formato NSDateFormatterLas llamadas de fecha resolvieron los problemas.

Cuestiones relacionadas