En un momento u otro, se encontrará con un bloqueo causado por EXC_BAD_ACCESS. En esta sugerencia rápida, aprenderá qué es EXC_BAD_ACCESS y cuál es su causa. También te daré algunos consejos para corregir errores causados por EXC_BAD_ACCESS.
Una vez que comprenda la causa subyacente de EXC_BAD_ACCESS, entenderá mejor su nombre críptico. Hay una explicación simple y una explicación más técnica. Comencemos con la explicación simple primero.
Cuando te encuentras con EXC_BAD_ACCESS, significa que estás enviando un mensaje a un objeto que ya se ha liberado. Este es el escenario más común, pero hay excepciones como las discutiremos en un momento.
La explicación técnica es un poco más compleja. En C y en Objective-C, tratas constantemente con punteros. Un puntero no es más que una variable que almacena la dirección de memoria de otra variable. Cuando envía un mensaje a un objeto, el puntero que apunta al objeto al que está enviando el mensaje debe estar desreferenciado. Esto significa que toma la dirección de memoria a la que apunta el puntero y accede al valor de ese bloque de memoria.
Cuando ese bloque de memoria ya no se asigna para su aplicación o, dicho de otro modo, ese bloque de memoria no se usa para lo que cree que se usa, ya no es posible acceder a esa porción de memoria. Cuando esto sucede, el kernel envía una excepción (EXC ª), indicando que su aplicación no puede acceder a ese bloque de memoria (MAL ACCESO).
En resumen, cuando se ejecuta en EXC_BAD_ACCESS, significa que intenta enviar un mensaje a un bloque de memoria que no puede ejecutar ese mensaje..
En algunos casos, sin embargo, EXC_BAD_ACCESS es causado por un puntero dañado. Cada vez que su aplicación intenta eliminar la referencia de un puntero dañado, el kernel lanza una excepción..
La depuración de EXC_BAD_ACCESS puede ser difícil y frustrante. Sin embargo, ahora que EXC_BAD_ACCESS ya no es un enigma para ti, debería ser menos desalentador.
Lo primero que debe comprender es que su aplicación no se bloquea necesariamente en el momento en que la aplicación ya no puede acceder al bloque de memoria. Eso es lo que a menudo hace que la depuración EXC_BAD_ACCESS sea tan difícil.
Lo mismo es cierto para los punteros corruptos. Su aplicación no se bloqueará porque un puntero se corrompió. Tampoco se bloqueará si pasas un puntero dañado en tu aplicación. Sin embargo, cuando la aplicación intenta eliminar la referencia al puntero dañado, la cosa sale mal..
Mientras que los zombis han ganado popularidad en los últimos años, han existido en Xcode durante más de una década. El nombre zombi puede sonar un poco dramático, pero en realidad es un gran nombre para la función que nos ayudará a depurar EXC_BAD_ACCESS. Déjame explicarte cómo funciona.
En Xcode, puedes habilitar objetos zombies, lo que significa que los objetos desasignados se mantienen como zombies. Dicho de otra manera, los objetos desasignados se mantienen vivos para fines de depuración. No hay magia involucrada. Si envía un mensaje a un objeto zombie, su aplicación aún se bloqueará como resultado de EXC_BAD_ACCESS.
¿Por qué es esto útil? Lo que dificulta la depuración de EXC_BAD_ACCESS es que no sabe a qué objeto intentaba acceder su aplicación. Los objetos zombis resuelven este problema en muchos casos. Al mantener vivos los objetos desasignados, Xcode puede decirle a qué objeto intentaba acceder, lo que facilita mucho más la búsqueda del problema..
Habilitar zombies en Xcode es muy fácil. Tenga en cuenta que esto puede variar según la versión de Xcode que esté usando. El siguiente enfoque se aplica a Xcode 6 y 7. Haga clic en el esquema activo en la parte superior izquierda y elija Esquema de edición.
Seleccionar correr a la izquierda y abre el Diagnósticos pestaña en la parte superior. Para habilitar objetos zombies, marque la casilla marcada Habilitar objetos zombie.
Si ahora se encuentra con EXC_BAD_ACCESS, la salida en la Consola de Xcode le dará una mejor idea de dónde comenzar su búsqueda. Echa un vistazo a la siguiente salida de ejemplo.
2015-08-12 06: 31: 55.501 Depuración [2371: 1379247] - [ChildViewController respondesToSelector:] mensaje enviado a la instancia desasignada 0x17579780
En el ejemplo anterior, Xcode nos está diciendo que un mensaje de respondsToSelector:
Fue enviado a un objeto zombie. Sin embargo, el objeto zombie ya no es una instancia de ChildViewController
clase. El bloque de memoria previamente asignado a la ChildViewController
La instancia ya no está asignada para su aplicación. Esto debería darle una buena idea de cuál es la causa raíz del problema.
Desafortunadamente, los objetos zombis no podrán guardar tu día por cada accidente causado por EXC_BAD_ACCESS. Si los objetos zombies no hacen el truco, es hora de un análisis adecuado.
Si los objetos zombies no resuelven tu problema, entonces la causa raíz puede ser menos trivial. En ese caso, debe observar más de cerca el código que se está ejecutando cuando su aplicación falla. Esto puede ser engorroso y llevar mucho tiempo..
Para ayudarlo a encontrar problemas en su base de código, puede pedirle a Xcode que analice su código para ayudarlo a encontrar áreas problemáticas. Tenga en cuenta que Xcode analiza su proyecto, lo que significa que señalará todos los problemas potenciales que encuentre.
Para decirle a Xcode que analice tu proyecto, elige Analizar de Xcode's Producto menú o presione Shift-Command-B. Xcode tardará unos minutos, pero cuando haya terminado, debería ver una lista de problemas en el Navegador de problemas a la izquierda. Los problemas encontrados por el análisis se resaltan en azul.
Cuando hace clic en un problema, Xcode lo lleva al bloque de código que necesita su atención. Tenga en cuenta que Xcode solo hace una sugerencia. En algunos casos, es posible que el problema no sea relevante y no sea necesario solucionarlo..
Si no puede encontrar el error que está causando EXC_BAD_ACCESS, entonces es importante examinar cuidadosamente cada problema que Xcode encontró durante el análisis de su proyecto..
EXC_BAD_ACCESS es una frustración común entre los desarrolladores y es algo inherente a la administración manual de la memoria. Los problemas relacionados con la administración de la memoria se han vuelto menos frecuentes desde la introducción de ARC (conteo automático de referencias), pero de ninguna manera han desaparecido..