2009-10-05 14 views
23

Acabo de descargar los informes de fallos de una de mis aplicaciones para iPhone desde iTunes Connect. El accidente más común tiene una huella como la siguiente:EXC_BAD_ACCESS en UIWebView

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0xa1b1c1db 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3030e6f4 objc_msgSend + 16 
1 UIKit       0x30ebebee -[UIWebView webView:resource:didFinishLoadingFromDataSource:] 
2 UIKit       0x30ebe5ca -[UIWebViewWebViewDelegate webView:resource:didFinishLoadingFromDataSource:] 
3 CoreFoundation     0x32b73b5c __invoking___ + 60 
4 CoreFoundation     0x32bc67be -[NSInvocation invoke] 
5 WebCore       0x320baa86 HandleDelegateSource 
6 CoreFoundation     0x32bb8a96 CFRunLoopRunSpecific 
7 CoreFoundation     0x32bb8356 CFRunLoopRunInMode 
8 GraphicsServices    0x30544cd4 GSEventRunModal 
9 GraphicsServices    0x30544d80 GSEventRun 
10 UIKit       0x30d2c768 -[UIApplication _run] 
11 UIKit       0x30d2b46c UIApplicationMain 

estoy alrededor del 80% de que este es un asunto interno de UIWebView y fuera del alcance de lo que puedo abordar. ¿Alguien tiene alguna sugerencia sobre cómo reducir este problema para ayudar a identificar si se trata de un problema con el sistema operativo y UIWebView, o un problema que puedo solucionar y abordar en mi código? Gracias por adelantado.

ACTUALIZACIÓN: El UIWebView en cuestión se encuentra en una vista que se libera cuando el usuario pulsa el botón Atrás del controlador de navegación correspondiente. La solución aceptada parece proporcionar una buena explicación de por qué ocurre este error.

Antes solución sugerida:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

Después solución sugerida:

- (void)dealloc { 
    webView.delegate = nil; 
    [webView stopLoading]; 
    [webView release]; 

    [super dealloc]; 
} 

Respuesta

53

El escenario es algo como esto:

  1. usuario entra en la pantalla con UIWebView. Los conjuntos UIViewControllerself como la página Web delegado
  2. inicia la descarga
  3. usuario sale de la pantalla 3a. UIViewController consigue desasignar
  4. UIWebView acabados de carga y envía "Terminé" mensaje a su delegado ...

tiene que dejar el UIWebView cargue su página y establece su delegado a cero antes de desasignar el delegado.

+2

Pondré dinero en un delegado liberado siendo la causa de esto. –

+0

veyr útil, gracias. –

+0

Esto es exactamente lo que me está sucediendo, excelente análisis. –

1

es casi 100% un error en el código. Los errores en el iPhone SDK son bastante raros y muchos desarrolladores han probado muy bien el UIWebView.

EXC_BAD_ACCESS se produce generalmente cuando intenta acceder a un objeto ya lanzado. Obviamente, si el código de Apple intenta hacer eso, usted es quien ha lanzado el objeto incorrectamente. ¿Estás seguro de que no tienes demasiado -autorelease o -release?

+2

me recuerda a la cita Anchorman "60% de las veces funciona todas las veces" – slf

0

Tome una mirada más dura dentro de la cosa en su código que está implementando el protocolo UIWebViewDelegate. En particular, quiere ver lo que está manejando webViewDidFinishLoad: Está intentando acceder a una variable que se ha liberado. Publique la fuente completa si puede, eso nos ayudará a encontrarlo para usted.

0

Tuve un problema similar. Estaba usando:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

El lanzamiento de "str" ​​causado el mensaje de error "EXC_BAD_ACCESS"

1

recientemente he tenido un problema similar donde mis aplicaciones se estrellaban al azar. Resulta que el problema estaba en usar "onclick=" en el HTML cargado.

Reemplazó onclick con simple <a href="javascript:some_script"> y el problema desapareció.

Espero que esto ayude a otros que están experimentando el mismo problema con webviews.