2009-10-05 14 views
23

Ho appena scaricato i rapporti sugli arresti anomali per una delle mie app per iPhone da iTunes Connect. L'incidente più comune ha una traccia simile alla seguente:EXC_BAD_ACCESS in 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 

Sono sicuro che circa l'80% si tratta di una questione interna al UIWebView e al di fuori della portata di quello che posso affrontare. Qualcuno ha qualche suggerimento su come restringere questo problema per aiutare a identificare se si tratta di un problema con il sistema operativo e UIWebView, o un problema che posso risolvere e risolvere nel mio codice? Grazie in anticipo.

UPDATE: l'UIWebView in questione è in una vista che viene rilasciata quando l'utente preme il pulsante indietro del controller di navigazione corrispondente. La soluzione accettata sembra fornire una buona spiegazione del perché questo errore si sta verificando.

Prima soluzione suggerita:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

Dopo Soluzione consigliata:

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

    [super dealloc]; 
} 

risposta

53

Lo scenario più o meno così:

  1. utente inserisce schermo con UIWebView. I UIViewController set self come delegato
  2. pagina Web inizia a scaricare
  3. utente esce da schermo 3a. UIViewController sarà disallocato
  4. UIWebView finiture di carico e invia un messaggio "ho finito" per il suo delegato ...

È necessario fermare il UIWebView di caricare la sua pagina e imposta il suo delegato a zero prima di rilasciare il delegato.

+2

Metterò soldi su un delegato rilasciato che ne è la causa. –

+0

veyr utile, grazie. –

+0

Questo è esattamente quello che mi sta succedendo, analisi eccellente. –

1

è quasi al 100% un errore nel codice. Gli errori nell'SDK dell'iPhone sono piuttosto rari e lo UIWebView è stato testato abbastanza bene da molti altri sviluppatori.

EXC_BAD_ACCESS si verifica in genere quando si tenta di accedere a un oggetto già rilasciato. Ovviamente se il codice di Apple sta cercando di farlo, tu sei quello che ha rilasciato l'oggetto in modo errato. Sei sicuro di non avere un -autorelease o -release troppo?

+2

mi ricorda la citazione di Anchorman "il 60% delle volte che funziona ogni volta" – slf

0

Dare un'occhiata più difficile all'interno del codice nel codice che implementa il protocollo UIWebViewDelegate. In particolare, si desidera esaminare ciò che sta gestendo webViewDidFinishLoad: Si sta tentando di accedere a una variabile che è stata rilasciata. Pubblica la fonte completa se puoi, che ci aiuterà a trovarlo per te.

0

Ho avuto un problema simile. Stavo usando:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

l'uscita di "str" ​​ha causato il messaggio di errore "EXC_BAD_ACCESS"

1

Recentemente ho avuto un problema simile in cui le mie applicazioni sono stati crollando in modo casuale. Risulta che il problema era nell'uso di "onclick=" nel codice HTML caricato.

Sostituito il onclick con semplice <a href="javascript:some_script"> e il problema è andato via.

Spero che questo aiuti gli altri che hanno riscontrato lo stesso problema con webviews.

Problemi correlati