2009-10-05 18 views
23

Ich habe gerade die Absturzberichte für eine meiner iPhone-Apps von iTunes Connect heruntergeladen. Der häufigste Crash hat eine Spur wie folgt aus: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 

Ich bin etwa 80% sicher, dass dies ein Problem intern zu UIWebView und außerhalb des Rahmens, was ich ansprechen kann. Hat jemand Vorschläge, wie Sie dieses Problem eingrenzen können, um festzustellen, ob es sich um ein Problem mit dem Betriebssystem und UIWebView handelt, oder um ein Problem, das ich in meinem Code beheben und beheben kann? Danke im Voraus.

UPDATE: Die UIWebView in Frage ist in einer Ansicht, die freigegeben wird, wenn der Benutzer die Zurück-Taste der entsprechenden Navigationssteuerung trifft. Die akzeptierte Lösung scheint eine gute Erklärung dafür zu liefern, warum dieser Fehler auftritt.

Vor vorgeschlagene Lösung:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

Nach vorgeschlagene Lösung:

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

    [super dealloc]; 
} 

Antwort

53

Das Szenario geht ungefähr so:

  1. Benutzer gibt Bildschirm mit UIWebView. Die UIViewController Sätze self als Delegierter
  2. Webseite startet
  3. Benutzer den Download-Exits Bildschirm 3a. UIViewController wird
  4. UIWebView beendet Laden freigegeben und sendet Nachricht an seinen Delegaten „ich fertig“ ...

Sie müssen die UIWebView vom Laden seiner Seite zu stoppen und setzt seine Delegierten auf Null, bevor Sie den Delegierten freigeben.

+2

Ich werde Geld auf einen freigegebenen Delegierten setzen, der die Ursache dafür ist. –

+0

veyr hilfreich, danke. –

+0

Das ist genau das, was mir passiert, ausgezeichnete Analyse. –

1

Es ist fast zu 100% ein Fehler im Code. Fehler im iPhone SDK sind ziemlich selten und UIWebView wurde von vielen anderen Entwicklern ziemlich gut getestet.

EXC_BAD_ACCESS tritt in der Regel, wenn Sie versuchen, ein bereits freigegebenes Objekt zuzugreifen. Offensichtlich, wenn Apples Code versucht, das zu tun, bist du derjenige, der das Objekt falsch veröffentlicht hat. Sind Sie sicher, dass Sie keine -autorelease oder -release zu viel haben?

+2

erinnert mich an das Anchorman Zitat "60% der Zeit funktioniert es jedes Mal" – slf

0

Werfen Sie einen härteren Blick in die Sache in Ihrem Code, der das UIWebViewDelegate Protokoll implementiert. Insbesondere möchten Sie sehen, was gerade gehandhabt wird. webViewDidFinishLoad: Sie versuchen, auf eine Variable zuzugreifen, die freigegeben wurde. Poste die vollständige Quelle, wenn du kannst, damit wir es für dich finden können.

0

Ich hatte ein ähnliches Problem. Ich war mit:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

Die Veröffentlichung von „str“ verursacht die Fehlermeldung „EXC_BAD_ACCESS“

1

ich vor kurzem hatte ein ähnliches Problem, wo meine apps zufällig wurden abstürzt. Es stellte sich heraus, dass das Problem darin bestand, "onclick=" im geladenen HTML zu verwenden.

die onclick mit einfachen <a href="javascript:some_script"> ersetzt und das Problem ging weg.

Hoffe das hilft anderen, die das gleiche Problem mit webviews erleben.