retener en bloqueos de [NSDate distantePast] ... a veces

En la aplicación que estoy escribiendo

        NSDate *test = [NSDate distantPast];
        [test retain]; // crashes with EXC_BAD_ACCESS

se bloquea casi todas las veces al retener, mientras que

        NSDate *test = [NSDate date];
        [test retain];

nunca.

Me desconcierta el por qué. El fragmento de código se llama en el hilo principal a través de una acción de la interfaz de usuario y lo estoy ejecutando en el simulador de IOS en el depurador. A veces funciona sin fallar. ¿Podría ser un problema de concurrencia? ¿Existe un problema obvio que me falta o debería intentar recortar mi aplicación hasta que funcione?

ACTUALIZACIÓN:

        NSDate *test = [[NSDate distantPast] copy];

también se bloquea, mientras

        NSDate *test = [[NSDate date] copy];

no lo hace. Limpiar la compilación y reiniciar el simulador de IOS tampoco ayudó.

ACTUALIZACIÓN 2:

Llamar al fragmento application:didFinishLaunchingWithOptions no choca. Mi aplicación debe estar haciendo algo que estropea el sistema. Publicaré una respuesta cuando averigüe qué.

ACTUALIZACIÓN 3 (RESUELTO):

La línea ofensiva estaba en algún lugar completamente diferente en mi aplicación:

INCORRECTO:

- (id)init
{
    lastUpdate = [NSDate distantPast];
}

La instancia de distantePast se libera automáticamente después de que la ejecución abandona el bloque de código de inicio. Debería haberlo retenido para contrarrestar esa liberación automática.

CORRECTO:

- (id)init
{
    lastUpdate = [[NSDate distantPast] retain];
}

preguntado el 30 de enero de 12 a las 19:01

¿Cuál es la diferencia entre los dos fragmentos? Yo también estoy perplejo. -

¿Y si lo intentas? test = [[NSDate distantPast] copy] ¿en lugar de? Misma propiedad, pero ruta diferente. -

@Vince y Abizern. Corrigí los fragmentos. De hecho, eran lo mismo. -

Es probable que esté arruinando la memoria en otro lugar y el problema solo se manifiesta en las líneas que proporcionó. No debe haber absolutamente nada de malo en retener distantPast, y si está convencido de que no hay nada más incorrecto en su código, debe enviar un informe de error. -

Acabo de tirar un poco NSDate *test = [[NSDate distantPast] copy]; en algunos lugares de un proyecto de prueba (en respuesta a una acción de la interfaz de usuario), lo toqué una docena de veces y no se bloquearon. ¡Algo sospechoso te está sucediendo! = [-

1 Respuestas

Crea un perfil de tu aplicación con el instrumento "Zombies". Cuando falla, debería poder ver el historial completo de retención / liberación del objeto malicioso y, a partir de ahí, averiguar qué salió mal.

Respondido el 31 de enero de 12 a las 00:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.