2009-10-05 21 views
23

Właśnie pobrałem raporty o awariach dla jednej z moich aplikacji na iPhone'a z iTunes Connect. Najczęstszym krach ma ślad tak:EXC_BAD_ACCESS w 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 

jestem około 80% upewnić się, że jest to problem wewnętrzny do UIWebView i poza zakres tego, co mogę zająć. Czy ktoś ma jakieś sugestie, w jaki sposób zawęzić ten problem, aby pomóc określić, czy jest to problem z systemem operacyjnym i UIWebView, czy problem, który mogę naprawić i zaadresować w moim kodzie? Z góry dziękuję.

AKTUALIZACJA: Omawiany UIWebView jest w widoku, który zostaje zwolniony po naciśnięciu przycisku wstecz odpowiedniego kontrolera nawigacyjnego. Przyjęte rozwiązanie wydaje się być dobrym wytłumaczeniem, dlaczego ten błąd występuje.

Przed Sugerowane rozwiązanie:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

Po Sugerowane rozwiązanie:

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

    [super dealloc]; 
} 

Odpowiedz

53

Scenariusz wygląda mniej więcej tak:

  1. użytkownika ekran wchodzi z UIWebView. W UIViewController zestawy self jako delegat
  2. stronie internetowej rozpoczyna pobieranie
  3. opuszczamy ekran 3a. UIViewController dostaje dealokowane
  4. UIWebView kończy ładowanie i wysyła „skończyłam” komunikat do swojego delegata ...

Trzeba zatrzymać UIWebView ładowanie swoją stronę i ustawia jego delegata do zera zanim deallocate delegata.

+2

Wpłacę pieniądze na zwolnionego delegata będącego tego przyczyną. –

+0

veyr pomocne, dzięki. –

+0

To jest dokładnie to, co się ze mną dzieje, doskonała analiza. –

1

To prawie 100% błąd w kodzie. Błędy w iPhone SDK są dość rzadkie i UIWebView zostało przetestowane całkiem dobrze przez wielu innych programistów.

EXC_BAD_ACCESS występuje zwykle przy próbie uzyskania dostępu do już zwolnionego obiektu. Oczywiście, jeśli kod Apple próbuje to zrobić, to jesteś tym, który błędnie wydał obiekt. Czy na pewno nie masz zbyt wiele -autorelease lub -release?

+2

przypomina mi cytat z Anchorman "60% czasu za każdym razem działa" – slf

0

Zagłęb się w obiekt w kodzie implementującym protokół UIWebViewDelegate. W szczególności chcesz spojrzeć na to, co obsługuje webViewDidFinishLoad: Próbujesz uzyskać dostęp do zmiennej, która została zwolniona. Opublikuj pełne źródło, jeśli możesz, które pomoże nam go znaleźć.

0

Miałem podobny problem. Używałem:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

Uwolnienie „str” spowodował komunikat o błędzie „EXC_BAD_ACCESS”

1

Niedawno miałem podobny problem, gdzie moje aplikacje były zawiesza się losowo. Okazuje się, że problem polegał na użyciu "onclick=" w załadowanym kodzie HTML.

Zastąpiono onclick prostym <a href="javascript:some_script">, a problem zniknął.

Mam nadzieję, że pomoże to innym osobom, które mają ten sam problem z webviews.