Estoy teniendo un problema extraño con algunos de mis probadores beta con los que estoy teniendo problemas. Los informes de fallos simbolizados indican que el bloqueo se produce en la asignación simple de un controlador como singleton, en la llamada de inicio, pero de acuerdo con el seguimiento de la pila, parece que el código que tengo en
Fallo de Strange Core Data con _Unwind_SjLj_Resume después de la migracióninit
no es en realidad el lugar del bloqueo. Aquí está el código correspondiente:
1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536| @synchronized(self)
1537| {
1538| if (sharedInstance == nil)
1539| sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540| }
1541| return sharedInstance;
1542| }
Esto nunca se ha colgado antes, y el código no ha cambiado en el último tiempo. Aquí está el seguimiento de la pila planteado:
Thread 5:
0 libSystem.B.dylib 0x33bd52d4 __kill + 8
1 libSystem.B.dylib 0x33bd52c4 kill + 4
2 libSystem.B.dylib 0x33bd52b6 raise + 10
3 libSystem.B.dylib 0x33be9d26 __abort + 62
4 libSystem.B.dylib 0x33be9d7e abort + 62
5 libSystem.B.dylib 0x33bd7980 __assert_rtn + 152
6 libgcc_s.1.dylib 0x32acab4e _Unwind_SjLj_Resume + 26
7 [REDACTED] 0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] (UA[REDACTED]PlayerController.m:1540)
8 [REDACTED] 0x00063e6c -[UA[REDACTED]PlayerViewController setupControlViews] (UA[REDACTED]PlayerViewController.m:224)
9 [REDACTED] 0x00062ce0 -[UA[REDACTED]PlayerViewController viewDidLoad] (UA[REDACTED]PlayerViewController.m:268)
10 UIKit 0x320a0270 -[UIViewController view] + 104
…
alguna idea de lo que este accidente es críptica y donde podría venir de?
ACTUALIZA 1
Parece que tiene que ver con los datos básicos y las migraciones. Pude duplicarlo, pero la causa raíz aún se desconoce. Tengo algunas migraciones automáticas que están en esta versión, y parece que si bien algunos de los objetos administrados por NS pueden leerse, otros están lanzando esta excepción, particularmente en una relación NSManagedObjects. Puede no estar relacionado con el
PlayerController
en absoluto. ¿Algún experto en Core-Data tiene alguna idea?
ACTUALIZACIÓN 2
Aquí está la pila de llamadas del accidente después de haber encontrado una manera de reproducirlo
y el código correspondiente:
if (resultArray && [resultArray count]) {
for (MixAudio *ma in resultArray) {
Audio *audio = [ma valueForKey:LOCAL_MIX_AUDIO_AUDIO_KEY];
if (audio) {
[returnArray addObject:audio];
}
}
Para ayudar explicar lo que hice para reproducirlo, tengo que explicar un poco la estructura de datos. Tengo Mix
y Audio
artículos. Las mezclas tienen muchos Audio, el audio pertenece a muchas mezclas. Esta es una llamada de relación simple en los objetos MixAudio para obtener el audio. Ahora, esto solo ha fallado aquí después de Hago una restauración de la base de datos a la nueva versión.
Copias de seguridad de la base de datos en mi configuración significa comprimir la base de datos para guardar los datos y luego descomprimir en la restauración. Este bloqueo solo ocurre después del proceso de restauración. Para hacer las cosas más complicadas, hay 3 versiones de bases de datos con modelos de mapeo. Debido a que este proceso funcionó para mí antes del control de versiones, creo que algo en mis versiones está causando este bloqueo.
Todos los demás datos están bien y se puede acceder, incluso guardar. De alguna manera, esta búsqueda única está causando problemas. No hay errores ni advertencias al configurar la tienda persistente o el modelo de objetos administrados. Además, se pueden crear nuevos objetos Mix y se puede acceder a ellos correctamente, solo fallan las búsquedas más antiguas (que estaban en el DB antes de la restauración).
Si no detectar el error, las impresiones de la consola:
Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
Poner una try/catch
alrededor de la línea de estrellarse me permite inspeccionar la causa raíz del accidente:
Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]
pero esto hace no tiene sentido (al menos para mí) para una simple llamada valueForKey
. 4294967295 = 2^32-1 lo que significa que el índice var probablemente se haya establecido en -1 si eso ayuda. Estoy perdido aquí.
[SOLUCIONADO] ACTUALIZACIÓN 3
que tenía razón acerca de que sea en el control de versiones :) Me releer el apartado de control de versiones en Zarra's book y tenía una gran DOH momento. Esta es la primera vez que tengo una aplicación con 3 versiones de bases de datos. Estoy usando Mapping Models en mi aplicación e ingenuamente asumí que los datos básicos serían capaces de mapear de 1 a 2 usando un modelo, luego de 2 a 3 usando el siguiente. Literalmente me golpeé la cabeza cuando me di cuenta de que no tenía un modelo de mapeo 1-3. para probarlo, agregué uno rápidamente y todo es tan suave como la mantequilla. Ahora solo tengo que volver y usar sus muestras
Progressive Data Migration
para facilitar mi vida a medida que avance con más versiones de este DB.
Estoy esperando Zarra conduce por aquí y respuestas algo ... cualquier cosa ... así que le puede dar los puntos de este :)
¿Estás seguro de que LOCAL_MIX_AUDIO_AUDIO_KEY está definido para el objeto Audio? -1 es NSNotFound, por lo que el sistema podría decidir que la clave no existe e intentar encontrarla de todos modos. Tal vez algo no se está migrando correctamente. – ughoavgfhw
Ya, está definido ... Acabo de descifrarlo y estoy actualizando la pregunta – coneybeare