Pregunta

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x30011940 in objc_msgSend ()
#1  0x30235f24 in CFRelease ()
#2  0x308f497c in -[UIImage dealloc] ()
#3  0x30236b78 in -[NSObject release] ()
#4  0x30a002a0 in FlushNamedImage ()
#5  0x30250a26 in CFDictionaryApplyFunction ()
#6  0x30a001a4 in _UISharedImageFlushAll ()
#7  0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8  0x3054dc80 in _nsnote_callback ()
#9  0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in -[UIApplication _receivedMemoryNotification] ()
#14 0x30a005d8 in _memoryStatusChanged ()
#15 0x30217416 in __CFNotificationCenterDarwinCallBack ()
#16 0x3020d0b0 in __CFMachPortPerform ()
#17 0x30254a76 in CFRunLoopRunSpecific ()
#18 0x3025416a in CFRunLoopRunInMode ()
#19 0x320452a4 in GSEventRunModal ()
#20 0x308f037c in -[UIApplication _run] ()
#21 0x308eea94 in UIApplicationMain ()
#22 0x00002096 in main (argc=1, argv=0x2ffff514)

Actualmente tengo un error muy raro en mi programa. A veces sucede, y, a veces, no lo hace. Pero aquí está un resumen de lo que está pasando:

Cuando el programa se pone en marcha:

  • los datos guardados (sólo un corto plist se compone de 13 elementos) se carga, si existe.
  • a plist enorme que contiene 1014 secuencias se carga en NSMutableDictionary.
  • otro plist contiene 78 cuerdas se carga en un NSArray.
  • una película .mp4 se juega.

El error se produce en una parte donde está siendo retirado OpenGL ES Ver y el usuario está a punto de ver una de las cadenas de las cadenas en el 1014 NSMutableDictionary.

Este error frecuente que se presenten en el simulador. Que sólo se producen en el iPhone, y, a veces funciona muy bien, pero a veces aplasta.

Sin embargo, después de leer el StackTrace, veo CFDictionaryApplyFunction allí, así que pensé que podría ser una de las posibles causas. ¿Es porque en el simulador, se lee cosas tan rápido que todo el diccionario de la plist se carga en un instante, mientras que en el dispositivo, se lee más lento? Honestamente, no sé exactamente cómo funciona el diccionario. Lo hace leer a través de todas las cadenas de 1014, en un momento, o que utiliza algunos otros hilos para leer despacio? Por favor aconséjame. Gracias.

¿Fue útil?

Solución

Cuando se obtiene una EXC_BAD_ACCESS, a menudo significa que está tratando de llamar a un método en un objeto que no está allí -. Probablemente debido a que se cancela la asignación

Sobre la mitad de la traza, hay algunos memoria de advertencia llamadas, tales como:

#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()

Lo que hace que parezca que ninguno de su código es directamente provocando el accidente, sino más bien un sistema de notificación cuando la memoria está baja.

Más cerca de enmarcar # 0, parece estar tratando de borrar la memoria caché de un objeto UIImage, y esto parece ser el mal acceso.

En base a esto, se conjetura es que se está asignando un puntero al valor de retorno autoreleased de un constructor de conveniencia; entonces el objeto se autoreleased, y se podría pensar que está bien porque no se utiliza la imagen directamente, pero la advertencia de memoria intenta acceder a él. Por ejemplo:

@interface MyClass {
  UIImage* myImage;
}
// ...
- (id) init {  /* the usual stuff */
  myImage = [UIImage imageNamed:@"bob_the.png"];
  return self;
}

En este ejemplo, incluso si usted tiene una propiedad de retener establecido en myImage, no estás realmente retener la imagen a menos que establezca el valor a través de self.myImage. Así, poco después de esta llamada, la imagen se libera, y usted tiene un puntero a la tierra de nadie.

Sin ver el código, no tengo manera de saber si eso es lo que realmente sucede, pero es un tipo de error que es fácil de hacer.

Estas preguntas relacionadas dan consejos sobre accidentes similares: EXC_BAD_ACCESS depuración 1 y pregunta 2 .

Por último, si nada de esto ayuda, sugiero encontrar un mínimos para la reproducción de su problema. La forma más difícil de hacer es copiar el código, cortar la mitad, ver si el error sigue ahí, y repetir hasta obtener el código más pequeño se puede encontrar que reproduce el error. Por lo general es mucho más fácil de depurar desde allí (y más contabilizable como una cuestión stackoverflow, también!) Si conoce el camino más fácil, que me haga saber.

Otros consejos

Es posible que desee establecer la variable de entorno NSZombiesEnabled. De esta manera su aplicación no se bloquea con EXC_BAD_ACCESS cuando se accede a los objetos puestos en libertad, sino que registra un mensaje informativo a la consola. Esta entrada de blog explica bastante bien lo que sucede y cómo configurarlo en XCode. De todas formas, nunca jamás se olvide de desactivar esta opción en las versiones de producción, ya que de otra manera nunca se dará a conocer sus objetos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top