EXC_BAD_ACCESS в UIWebView - PullRequest
       11

EXC_BAD_ACCESS в UIWebView

27 голосов
/ 05 октября 2009

Я только что загрузил отчеты о сбоях для одного из своих приложений для 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];
}

Ответы [ 5 ]

63 голосов
/ 05 октября 2009

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

  1. Пользователь выходит на экран с UIWebView. UIViewController устанавливает self в качестве делегата
  2. Веб-страница начинает загружаться
  3. Пользователь выходит из экрана
    3a. UIViewController освобождается
  4. UIWebView завершает загрузку и отправляет сообщение «Я закончил» своему делегату ...

Вам нужно остановить загрузку страницы UIWebView и установить для его делегата значение nil, прежде чем вы освободите делегата.

3 голосов
/ 05 октября 2009

Это почти 100% ошибка в вашем коде. Ошибки в iPhone SDK довольно редки, и UIWebView довольно хорошо протестирован многими другими разработчиками.

EXC_BAD_ACCESS обычно происходит при попытке получить доступ к уже освобожденному объекту. Очевидно, что если код Apple пытается это сделать, то вы тот, кто ошибочно выпустил объект. Вы уверены, что у вас нет -autorelease или -release слишком много?

1 голос
/ 10 ноября 2016

У меня недавно была похожая проблема, когда мои приложения зависали случайно. Оказывается, проблема была в использовании "onclick=" в загруженном HTML.

Заменил onclick на простой <a href="javascript:some_script">, и проблема исчезла.

Надеюсь, что это поможет другим, кто испытывает ту же проблему с webviews.

0 голосов
/ 28 декабря 2009

У меня была похожая проблема. Я использовал:

 [webView loadHTMLString:str baseURL:tmpUrl];

 [str release];

Выпуск "str" ​​вызвал сообщение об ошибке "EXC_BAD_ACCESS"

0 голосов
/ 05 октября 2009

Посмотрите на вещи в вашем коде, которые реализуют протокол UIWebViewDelegate. В частности, вы хотите посмотреть, что обрабатывает webViewDidFinishLoad: Вы пытаетесь получить доступ к переменной, которая была освобождена. Если возможно, опубликуйте полный источник, который поможет нам найти его для вас.

...