UIWebView中的EXC_BAD_ACCESS

时间:2009-10-05 15:07:39

标签: iphone uiwebview crash-reports

我刚从iTunes Connect下载了我的一个iPhone应用程序的崩溃报告。最常见的崩溃有如下所示的痕迹:

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内部的问题,超出了我能解决的范围。有没有人有任何关于如何缩小这个问题的建议,以帮助确定它是OS和UIWebView的问题,还是我可以在我的代码中修复和解决的问题?提前谢谢。

更新:当用户点击相应导航控制器的后退按钮时,所讨论的UIWebView处于视图中。接受的解决方案似乎为这个错误发生的原因提供了一个很好的解释。

在建议的解决方案之前:

- (void)dealloc {
    [webView release];

    [super dealloc];
}

建议解决方案后:

- (void)dealloc {
    webView.delegate = nil;
    [webView stopLoading];
    [webView release];

    [super dealloc];
}

5 个答案:

答案 0 :(得分:63)

场景如下:

  1. 用户使用UIWebView进入屏幕。 UIViewController设置self作为代理
  2. 网页开始下载
  3. 用户退出屏幕
    3A。 UIViewController被取消分配
  4. UIWebView完成加载并向其委托发送“我已完成”消息...
  5. 在解除分配委托之前,您需要停止UIWebView加载其页面并将其委托设置为nil。

答案 1 :(得分:3)

您的代码几乎100%出错。 iPhone SDK中的错误非常少见,许多其他开发人员已经对UIWebView进行了很好的测试。

当您尝试访问已发布的对象时,通常会发生

EXC_BAD_ACCESS。显然,如果Apple的代码试图这样做,那么你就是那个错误地发布了这个对象的人。您确定没有-autorelease-release太多吗?

答案 2 :(得分:1)

我最近有一个类似的问题,我的应用程序随机崩溃。原来问题是在加载的HTML中使用“onclick=”。

用简单onclick替换了<a href="javascript:some_script">,问题就消失了。

希望这可以帮助遇到webviews相同问题的其他人。

答案 3 :(得分:0)

更深入地了解代码中实现UIWebViewDelegate协议的内容。特别是你想要查看正在处理的任何内容webViewDidFinishLoad:您正在尝试访问已发布的变量。如果可以,请发布完整的来源,这将有助于我们为您找到它。

答案 4 :(得分:0)

我有类似的问题。我正在使用:

 [webView loadHTMLString:str baseURL:tmpUrl];

 [str release];

“str”的发布导致错误消息“EXC_BAD_ACCESS”