Подтвердить что ты не робот

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];
}
4b9b3361

Ответ 1

Сценарий выглядит примерно так:

  1. Пользователь входит в экран с UIWebView. UIViewController устанавливает self в качестве делегата
  2. Веб-страница начинает загружаться
  3. Пользователь выходит из экрана
    3a. UIViewController освобождается
  4. 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"