286 votos

EXC_BAD_ACCESS señal recibida

Al desplegar la aplicación en el dispositivo, el programa se cierra después de un par de ciclos, con el siguiente error:

Program received signal: "EXC_BAD_ACCESS".

El programa se ejecuta sin ningún problema en el iPhone simulator, también depurar y ejecutar como me paso a través de las instrucciones de una en una. Tan pronto como me deja correr de nuevo, voy a golpear la EXC_BAD_ACCESS de la señal.

En este caso particular, que pasó a ser un error en el acelerómetro código. No ejecutar dentro del simulador, que es la razón por la que no tiró ningún error. Sin embargo, podría ejecutar una vez desplegado el dispositivo.

La mayoría de las respuestas a esta pregunta de acuerdo con el general EXC_BAD_ACCESS de error, así que voy a dejar este espacio abierto como un catch-all para el temido Mal de error de Acceso.

EXC_BAD_ACCESS normalmente es arrojado como resultado de un ilegales de acceso a la memoria. Usted puede encontrar más información en las siguientes respuestas.

Se ha encontrado en la EXC_BAD_ACCESS de la señal antes, y ¿cómo lidiar con ella?

195voto

philsquared Puntos 13547

Desde su descripción sospecho que la explicación más probable es que tengas algún error en su gestión de la memoria. Usted dijo que han estado trabajando en el desarrollo de iPhone para un par de semanas, pero no tengas experiencia con Objective C en general. Si usted ha venido de otro fondo puede tomar un poco de tiempo antes de que realmente internalizar la gestión de la memoria en reglas, a menos que usted haga un gran punto de la misma.

Recuerde, cualquier cosa que usted obtenga de una asignación de función (normalmente la estática alloc método, pero hay un par de otros), o un método de copia, usted es dueño de la memoria demasiado y debe ser liberada cuando haya terminado.

Pero si usted consigue algo a partir de casi cualquier cosa , incluyendo métodos de fábrica (por ej. [NSString stringWithFormat]), entonces usted tendrá un grupo de liberación automática de referencia, lo que significa que podría ser lanzado en algún momento en el futuro, por otras de código por lo que es vital que si usted necesita para mantener a su alrededor más allá de la función inmediata que se conservan. Si no, la memoria puede permanecer asignado, mientras que usted está utilizando, o ser liberados, pero casualmente siguen siendo válidos, durante el emulador de pruebas, pero es más probable que sea liberado y se muestran tan malo acceso errores cuando se ejecuta en el dispositivo.

La mejor manera de realizar un seguimiento de estas cosas, y una buena idea de todos modos (incluso si no hay problemas aparentes) es ejecutar la aplicación en los Instrumentos de la herramienta, especialmente con las Filtraciones opción.

101voto

bentford Puntos 9981

Una de las principales causas de EXC_BAD_ACCESS es de intentar acceder a lanzado objetos.

Para averiguar cómo solucionar esto, leer este documento: DebuggingAutoReleasePool

Incluso si usted no piensa que usted es "la liberación de auto-lanzamiento de objetos", esto se aplica a usted.

Este método funciona muy bien. Yo lo uso todo el tiempo con gran éxito!!

En resumen, esto explica cómo el uso del Cacao NSZombie la depuración de la clase y de la línea de comandos "malloc_history" herramienta para encontrar exactamente lo publicado objeto ha sido visitado en su código.

Nota al margen:

Ejecución de los Instrumentos y la detección de fugas no va a ayudar a solucionar EXC_BAD_ACCESS. Estoy bastante seguro de pérdidas de memoria no tienen nada que ver con EXC_BAD_ACCESS. La definición de una fuga es un objeto que no tiene acceso a, y por lo tanto no se puede llamar.

ACTUALIZACIÓN: Yo uso ahora de los Instrumentos para la depuración de las Fugas. Desde Xcode 4.2, elija Producto->Perfil y cuando los Instrumentos se inicia, elija "Zombies".

12voto

Adam Rosenfield Puntos 176408

Un EXC_BAD_ACCESS de la señal es el resultado de pasar un puntero no válido para una llamada de sistema. Tengo uno justo el día de hoy con un programa de prueba en OS X yo estaba pasando una variable no inicializada a pthread_join(), lo cual fue debido a un error tipográfico.

Yo no estoy familiarizado con el desarrollo de iPhone, pero usted debe revisar todos sus punteros de búfer que está pasando al sistema de llamadas. Escucha tu compilador de advertencia de nivel de todo el camino (con gcc, el uso de la -Wall y -Wextra opciones). Permita que el mayor número de diagnósticos en el simulador/depurador como sea posible.

8voto

Brent Royal-Gordon Puntos 8044

En mi experiencia, esto es generalmente causado por un ilegales de acceso a la memoria. Compruebe que todos los punteros, especialmente objeto de los punteros, para asegurarse de que está inicializado. Asegúrese de que su MainWindow.xib archivo, si usted está utilizando uno, está configurado correctamente, con todas las conexiones necesarias.

Si ninguno de los que sobre el papel la comprobación de vueltas a nada, y no sucede cuando solo de paso, tratar de localizar el error con NSLog() instrucciones: espolvorear el código con ellos, moviéndolos hasta aislar la línea que está causando el error. A continuación, establezca un breakpoint en la línea y ejecuta el programa. Cuando alcance el breakpoint, examinar todas las variables, y los objetos en ellos, para ver si algo no tiene el aspecto que expect.I había sobre todo mantener un ojo hacia fuera para las variables cuya clase de objeto es algo que no esperaba. Si una variable se supone que contienen una UIWindow pero tiene un NSNotification en el lugar, el mismo subyacente, código de error podría ser que se manifiesta en una forma diferente cuando el depurador no está en funcionamiento.

6voto

Rob Puntos 1895

No es una respuesta completa, pero una situación específica en la que he recibido esta es cuando se intenta obtener acceso a un objeto que " murió " porque he intentado utilizar el grupo de liberación automática:

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

Así, por ejemplo, de que en realidad estaba pasando esto como un objeto a 'notificar' (registrado como oyente, observador, sea cual sea el idioma que te gusta), pero ya había muerto una vez que la notificación fue enviada y me gustaría obtener la EXC_BAD_ACCESS. El cambio a [[MyNetObject alloc] init] y liberarlo más tarde, según corresponda resolver el error.

Otra razón por la que esto puede ocurrir es, por ejemplo, si se pasa un objeto y trate de guardarlo:

myObjectDefinedInHeader = aParameterObjectPassedIn;

Más tarde, cuando se intenta acceder a myObjectDefinedInHeader puede meterse en problemas. Uso:

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

puede ser lo que usted necesita. Por supuesto, estos son sólo un par de ejemplos de lo que he ejecutado y hay otras razones, pero puede resultar difícil de alcanzar por lo menciono. Buena suerte!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X