NSDateFormatter falla cuando se usa desde diferentes subprocesss.

Seguimos recibiendo un crash extraño y extraño con NSDateFormatter . La traza de stack relevante es:

 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:] () 

El formateador de date todavía está en la memory (es decir, no está liberado o está dañado). Lo único que se me ocurre es que las cadenas en caso de fallo no se ajustan al formatting, pero dudo que haga que el formateador se bloquee por completo. (no es trivial comprobar el formatting de antemano).

¿Alguna idea?

Gracias a los respondedores anteriores.

Esto no fue un problema de memory. Resultó ser un problema de synchronization. NSDateFormatter s no son seguros para subprocesss; había un subprocess de background que intentaba usar el mismo formateador al mismo time (de ahí la aleatoriedad).

¡Espero que esto ayude a alguien en el futuro!

Otra solución sería serializar la ejecución del código que utiliza NSDateFormatter s, o cualquier otro object que no sea NSDateFormatter para subprocesss. Al usar Grand Central Dispatch puede presionar el código en main_queue:

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

o use una queue 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]; }); 

EXCBADACCESS ocurrirá cuando use cualquier object desasignado … Trate de usar NSZombie .. Es una manera fácil de encontrar dónde se produce el EXCBADACCESS … Especificará qué método dónde y qué object se desasigna

Vea este enlace http://www.markj.net/iphone-memory-debug-nszombie/

Mi apuesta es que la cadena que pase al formateador de la date se haya liberado.

Estaba experimentando crashs extraños con _sigtramp que hacía que la aplicación apareciera bloqueada pero todavía en la pantalla, obstruyendo por completo la verdadera causa raíz.

Resultó ser que introdujimos el análisis de datos de varios subprocesss que colisionó con el subprincipal de la interfaz gráfica de usuario que intentaba analizar dates utilizando NSDateFormatter.

Al poner cierta synchronization alnetworkingedor de las llamadas formatDate de NSDateFormatter se resolvieron los problemas.