7

Poniżej znajduje się to, co skopiowałem/wkleiłem z dziennika awarii wysłanego przez klienta. Nie jestem w stanie zrozumieć, co to znaczy: sAplikacja ulega awarii po uruchomieniu NavigationController!

Wygląda na to, że aplikacja uległa awarii po przejściu z powrotem do poprzedniego ekranu (i to właśnie zgłosił klient). Co to jest UIWebDocumentView?

Muszę rozwiązać awarię, ale utknąłem tutaj, więc każda pomoc jest bardzo ceniona.

P.S. Używam iphone sdk 3.0.

Date/Time:  2009-09-29 18:16:28.458 -0400 
OS Version:  iPhone OS 3.0 (7A341) 
Report Version: 104 

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

    Thread 4 Crashed: 

     0 WebCore       0x3588dd74 __ZL17_WebTryThreadLockb + 288 
     1 WebCore       0x3588e4c0 __ZL18_WebThreadAutoLockv + 52 
     2 UIKit       0x30aea484 -[UIWebDocumentView _responderForBecomeFirstResponder] + 8 
     3 UIKit       0x30978b34 -[UINavigationTransitionView transition:fromView:toView:] + 200 
     4 UIKit       0x30978a54 -[UINavigationTransitionView transition:toView:] + 24 
     5 UIKit       0x30974470 -[UINavigationController _startTransition:fromViewController:toViewController:] + 1604 
     6 UIKit       0x30973d90 -[UINavigationController _startDeferredTransitionIfNeeded] + 256 
     7 UIKit       0x309a7468 -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:] + 400 
     8 UIKit       0x309a72c8 -[UINavigationController popViewControllerAnimated:] + 32 
     9 Snocell       0x0002ae00 0x1000 + 171520 
     10 Foundation      0x30554062 -[NSThread main] + 42 
     11 Foundation      0x305023f2 __NSThread__main__ + 852 
     12 libSystem.B.dylib    0x31d705a0 _pthread_body + 20 
+1

Ok, chyba znalazłem rozwiązanie. Udostępnienie go na wypadek, gdyby ktoś tu spadł: EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS oznacza, że ​​adres wirtualny, którego referendumujesz, nie znajduje się w tabelach stron lub nie masz do niego dostępu. Jest to adres wirtualny, do którego nie masz dostępu. Dla twojego przykładu adres adresu 0x67696c69 jest prawdopodobne, że jest to coś, co nie jest wskaźnikiem, który był traktowany jak wskaźnik; lub struktura danych zawierająca wskaźnik została zwolniona i zastąpiona innymi danymi. I wtedy widzę WebCore w dzienniku, komponent w iPhone WebKit (http://bit.ly/4j4WsN) –

+1

Więc, co robiłem tutaj, rozdzielając stronę internetową w UIWebView i zanim mógł załadować całkowicie, popping powrót do poprzedniego widoku kontrolerów i to CRASHED. Zauważyłem, że UIWebView musi mieć delegata wyczyszczone przed zwolnieniem; w przeciwnym razie, jeśli żądanie internetowe zostanie zakończone po zwolnieniu UIWebView, spróbuje oddzwonić do delegata i spowoduje awarię aplikacji. ROZWIĄZANIE: Dodałem "myWebView.delegate = nil;" przed pojawieniem się kontrolera widoku i działa teraz :) –

+1

Miałem podobny problem - webView.delegate = nil go rozwiązał, tak jak dla ciebie. –

Odpowiedz

15

Ok, myślę, że znalazł rozwiązanie. Udostępnianie go na wypadek, gdyby ktoś inny znalazł się w takiej samej sytuacji:

EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS oznacza, że ​​adres wirtualny, którego referendumujesz, nie znajduje się w tabelach stron lub nie masz do niego dostępu. Jest to adres wirtualny, do którego nie masz dostępu. Dla twojego przykładu adres adresu 0x67696c69 jest prawdopodobne, że jest to coś, co nie jest wskaźnikiem, który był traktowany jak wskaźnik; lub struktura danych zawierająca wskaźnik została zwolniona i zastąpiona innymi danymi.

A potem widzę WebCore w ślad stosu w dzienniku (WebCore jest składnikiem w iPhone WebKit - http://en.wikipedia.org/wiki/WebKit#Components)

Więc co ja tu robię, dispalying stronę internetową w UIWebView i przed nim może załadować się całkowicie, wracając do poprzednich kontrolerów widoku i to jest CRASHED.

Zauważyłem, że UIWebView musi mieć delegata wyczyszczone przed zwolnieniem; w przeciwnym razie, jeśli żądanie internetowe zostanie zakończone po zwolnieniu UIWebView, spróbuje oddzwonić do delegata i spowoduje awarię aplikacji.

ROZWIĄZANIE: I dodaje następujący kod przed popping widoku kontrolera i to działa teraz :)

if (webView.loading) 
    [webView stopLoading]; 
webView.delegate = nil; 
+0

Ta poprawka nie działa dla mnie (chociaż testowałem na starszym iPhonie 2G). Właśnie usunąłem wywołanie popViewController. Nie najmądrzejszy z rozwiązań, ale działa, a pod pewnymi względami jest bardziej logiczny. –

+0

Okazało się, że usunięcie instrukcji popViewController naprawiło również inne problemy. Myślę, że lepiej nie wywoływać popViewController w metodzie didFailLoadWithError. –

+0

Dzięki, pomógł mi dowiedzieć się, w jaki sposób skierować mnie w stronę – 2cupsOfTech

0

myślę dodaje będzie właściwe podejście. Ustaw delegata na zero jako pierwszy.

webView.delegate = nil; 
if (webView.loading) 
    [webView stopLoading]; 
Powiązane problemy