ios - NSDateFormatter se bloquea cuando se usa desde diferentes hilos
objective-c multithreading (5)
EXCBADACCESS ocurrirá cuando use cualquier objeto desasignado ... Trate de usar NSZombie ... Es una manera fácil de encontrar dónde se produce EXCBADACCESS ... Especificará qué Método dónde y qué objeto se desasigna
Vea este enlace http://www.markj.net/iphone-memory-debug-nszombie/
Seguimos teniendo un accidente aleatorio y extraño con NSDateFormatter
. La traza de pila 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 fecha aún está en la memoria (es decir, no se ha liberado ni está dañado). Lo único en lo que puedo pensar es que las cadenas al bloquearse no se ajustan al formato, pero dudo que eso haga que el formateador se bloquee por completo. (No es trivial comprobar el formato de antemano).
¿Alguna idea?
Estaba experimentando choques extraños con _sigtramp, lo que provocó que la aplicación apareciera bloqueada pero aún en la pantalla, obstruyendo por completo la causa raíz real.
De hecho, resultó que introdujimos el análisis de datos de varios subprocesos que chocó con el subproceso de la GUI principal al intentar analizar las fechas utilizando NSDateFormatter.
Al poner algo de sincronización en torno al formato NSDateFormatter, las llamadas de fecha resolvieron los problemas.
Gracias a los anteriores respondedores.
Esto no fue un problema de memoria. Resultó ser un problema de sincronización. NSDateFormatter
s no son seguros para subprocesos; hubo 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!
Mi apuesta es que la cadena que se pasa al formateador de fecha está sobrepasada.
Otra solución sería serializar la ejecución del código que utiliza NSDateFormatter
s, o cualquier otro objeto que no sea seguro para subprocesos. Usando Grand Central Dispatch puedes empujar el código en la main_queue:
dispatch_async(dispatch_get_main_queue(), ^(void){
[some_object some_message];
});
o usa 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];
});