7

Ниже я копирую/вставляю из журнала сбоев, отправленного клиентом. Я не могу понять, что это значит: sПриложение сбой при наведении навигационного контроллера!

По-видимому, похоже, что приложение потерпело крах при переходе на предыдущий экран (и это то, что сообщил клиент). Что такое UIWebDocumentView здесь?

Мне нужно решить проблему, но я застрял здесь, поэтому любая помощь очень ценится.

P.S. Я использую 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

Хорошо, я думаю, я нашел решение. Разделите его на случай, если кто-то сюда упадет: EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS означает, что виртуальный адрес, на который вы ссылаетесь, не находится в таблицах страниц или у вас нет доступа. Это виртуальный адрес, к которому вам не разрешен доступ. Для вашего адреса адреса 0x67696c69 вполне вероятно, что это то, что не является указателем, который обрабатывался как указатель; или ваша структура данных, содержащая указатель, была бесплатной и перезаписана другими данными. И затем я вижу WebCore в журнале, компонент в iPhone WebKit (http://bit.ly/4j4WsN) –

+1

Итак, что я здесь делал, рассылая веб-сайт в UIWebView и до того, как он мог полностью загрузиться, popping назад к предыдущим контроллерам представлений, и это КРИСТАЛЛ. Я обнаружил, что UIWebView должен очистить делегата до его выпуска; в противном случае, если веб-запрос завершается после выпуска UIWebView, он пытается вернуться к делегату и вызывает сбой приложения. РЕШЕНИЕ: Я добавил «myWebView.delegate = nil;» перед появлением контроллера и теперь он работает :) –

+1

У меня была аналогичная проблема - webView.delegate = nil решил ее, как и для вас. –

ответ

15

Хорошо, я думаю, я нашел решение. Разделите его, если кто-то другой попадет в ту же ситуацию:

EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS означает, что виртуальный адрес, на который вы ссылаетесь, не находится в таблицах страниц или у вас нет доступа. Это виртуальный адрес, к которому вам не разрешен доступ. Для вашего адреса адреса 0x67696c69 вполне вероятно, что это то, что не является указателем, который обрабатывался как указатель; или ваша структура данных, содержащая указатель, была бесплатной и перезаписана другими данными.

И тогда я вижу WebCore в трассировки стека в журнале (WebCore является компонентом в iPhone WebKit - http://en.wikipedia.org/wiki/WebKit#Components)

Итак, что я делаю здесь, dispalying сайт в UIWebView и перед ним может полностью загрузиться, возвращаясь к предыдущим контроллерам представлений, и это CRASHED.

Я обнаружил, что UIWebView должен очистить свой делегат до его выпуска; в противном случае, если веб-запрос завершается после выпуска UIWebView, он пытается вернуться к делегату и вызывает сбой приложения.

РЕШЕНИЕ: Я добавил следующий код, прежде чем хлопать вид контроллера, и теперь он работает :)

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

Это исправление не сработало для меня (хотя я тестировал пожилой iPhone 2G). Вместо этого я просто удалил вызов popViewController. Не самый умный из решений, но он работает, и в некотором смысле это более логично. –

+0

Оказалось, что удаление инструкции popViewController также устраняет другие проблемы. Я думаю, что лучше не вызывать popViewController в методе didFailLoadWithError. –

+0

Спасибо, было полезно разобраться в том, чтобы дать мне правильное направление для изучения – 2cupsOfTech

0

Я думаю, что следующий будет правильный подход. Сначала установите делегат на нуль.

webView.delegate = nil; 
if (webView.loading) 
    [webView stopLoading]; 
Смежные вопросы