EXC_BAD_ACCESS в UIWebView
Я только что загрузил отчеты о сбоях для одного из моих iPhone-приложений из iTunes Connect. Наиболее частая авария имеет следующие следы:
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
Я около 80% уверен, что это проблема, внутренняя для UIWebView и вне сферы охвата того, что я могу решить. Есть ли у кого-нибудь какие-либо предложения о том, как сузить эту проблему, чтобы определить, является ли проблема с ОС и UIWebView, или проблемой, которую я могу исправить и указать в моем коде? Спасибо заранее.
ОБНОВЛЕНИЕ: рассматриваемый UIWebView находится в представлении, которое выдается, когда пользователь нажимает кнопку "Назад" соответствующего навигационного контроллера. Принятое решение, по-видимому, дает хорошее объяснение причин возникновения этой ошибки.
Перед предлагаемым решением:
- (void)dealloc {
[webView release];
[super dealloc];
}
После предлагаемого решения:
- (void)dealloc {
webView.delegate = nil;
[webView stopLoading];
[webView release];
[super dealloc];
}
Ответы
Ответ 1
Сценарий выглядит примерно так:
- Пользователь входит в экран с
UIWebView
. UIViewController
устанавливает self
в качестве делегата - Веб-страница начинает загружаться
- Пользователь выходит из экрана
3a. UIViewController
освобождается -
UIWebView
завершает загрузку и отправляет сообщение "Я закончил" своему делегату...
Вам нужно остановить загрузку своей страницы UIWebView
и установить для его делегата значение nil, прежде чем вы освободите делегата.
Ответ 2
Это почти 100% ошибка в коде. Ошибки в iPhone SDK довольно редки, и UIWebView
был проверен неплохо многими другими разработчиками.
EXC_BAD_ACCESS
происходит обычно, когда вы пытаетесь получить доступ к уже выпущенному объекту. Очевидно, что если код Apple пытается сделать это, вы тот, кто неправильно выпустил объект. Уверены ли вы, что у вас нет -autorelease
или -release
слишком много?
Ответ 3
Недавно у меня была аналогичная проблема, когда мои приложения случайно разбивались. Оказывается, проблема заключалась в использовании "onclick=
" в загруженном HTML.
Заменил onclick
простой <a href="javascript:some_script">
, и проблема исчезла.
Надеемся, что это поможет другим, которые испытывают ту же проблему с webviews
.
Ответ 4
Взгляните внутрь вещи в коде, который реализует протокол UIWebViewDelegate
. В частности, вы хотите посмотреть, что обрабатывается. webViewDidFinishLoad:
Вы пытаетесь получить доступ к выпущенной переменной. Отправьте полный источник, если сможете, что поможет нам найти его для вас.
Ответ 5
У меня была аналогичная проблема. Я использовал:
[webView loadHTMLString:str baseURL:tmpUrl];
[str release];
Релиз "str" вызвал сообщение об ошибке "EXC_BAD_ACCESS"