我刚从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];
}
答案 0 :(得分:63)
场景如下:
UIWebView
进入屏幕。 UIViewController
设置self
作为代理UIViewController
被取消分配UIWebView
完成加载并向其委托发送“我已完成”消息... 在解除分配委托之前,您需要停止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”