UIWebView中的EXC_BAD_ACCESS

29

我刚从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内部问题,超出了我能够解决的范围。请问有没有人有任何建议来缩小问题范围,以帮助确定它是与操作系统和UIWebView有关的问题,还是可以在我的代码中修复和解决的问题?提前感谢。

更新:所涉及的UIWebView位于一个视图中,当用户点击相应导航控制器的后退按钮时,该视图会被释放。已接受的解决方案似乎对为什么会出现此错误提供了一个好的解释。

在建议的解决方案之前:

- (void)dealloc {
    [webView release];

    [super dealloc];
}

建议解决方案后:

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

    [super dealloc];
}
5个回答

66
情景如下:
1. 用户进入带有UIWebView的屏幕。 UIViewController将自己设置为代理。 2. 网页开始下载。 3. 用户退出屏幕 3a. UIViewController被释放。 4. UIWebView加载完成并向其代理发送“我完成了”消息...
在释放代理之前,您需要停止UIWebView加载其页面并将其代理设置为nil。

2
我认为发布的代理可能是其中的原因。 - Rog

4

这几乎完全是你代码中的错误。iPhone SDK 中的错误非常少,UIWebView 已经被许多其他开发人员进行了充分的测试。

EXC_BAD_ACCESS 通常发生在您尝试访问已释放的对象时。显然,如果 Apple 的代码正在尝试这样做,那么您就是错误地释放了对象。您确定没有过多使用 -autorelease-release 吗?


3
这让我想起《王牌播音员》中的一句话:“它能有60%的成功率,每次都成功。” - slf
有关EXC_BAD_ACCESS和其他类型的崩溃的更多信息,请参见:https://developer.apple.com/library/archive/technotes/tn2151/_index.html - rgkobashi

1
我最近遇到了一个类似的问题,我的应用程序会随机崩溃。结果发现问题出在加载的HTML中使用了“onclick=”。将onclick替换为简单的<a href="javascript:some_script">后,问题消失了。希望这能帮助其他遇到同样问题的人解决webviews的问题。

0

我曾经遇到过类似的问题。我当时使用的是:

 [webView loadHTMLString:str baseURL:tmpUrl];

 [str release];

"str"的发布导致了错误消息"EXC_BAD_ACCESS"


0

仔细检查一下你代码中实现了 UIWebViewDelegate 协议的部分。特别是要看看处理 webViewDidFinishLoad: 的部分。你正在尝试访问一个已经被释放的变量。如果可以,请发布完整的源代码,这将有助于我们为你找到问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接