iOS UIWebView在"WebThread"中崩溃

8

有人能帮我解决这个崩溃问题吗?当我在加载一些UIWebView实例时,它们之间不断切换时,偶尔会发生崩溃。

崩溃通常略有不同,但它总是类似于"WebThread"的崩溃,具有相似的堆栈跟踪。

以下是两次崩溃的相关部分:

日期/时间:2011-11-08 14:29:01.165 -0500
操作系统版本:iPhone OS 5.0(9A334)
报告版本:104
异常类型:EXC_BAD_ACCESS(SIGSEGV) 异常代码:KERN_INVALID_ADDRESS at 0x00000006 崩溃线程:4
线程4名称:WebThread 线程4崩溃: 0 ??? 0x00000006 0 + 6 1 WebCore 0x32a36154-[QuickLookHandleAsDelegate连接:didReceiveData:lengthReceived:] + 72 2 QuickLook 0x30bee2c2-[QLThreadInvoker connectionDidReceiveDataLengthReceived:] + 90 3 CoreFoundation 0x3537a226-[NSObject performSelector:withObject:] + 38 4 Foundation 0x32ce2752 __NSThreadPerformPerform + 346 5 CoreFoundation 0x353efafe __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10 6 CoreFoundation 0x353ef2ca __CFRunLoopDoSources0 + 210 7 CoreFoundation 0x353ee070 __CFRunLoopRun + 648 8 CoreFoundation 0x353714d8 CFRunLoopRunSpecific + 296 9 CoreFoundation 0x353713a0 CFRunLoopRunInMode + 100 10 WebCore 0x324c912a _ZL12RunWebThreadPv + 398 11 libsystem_c.dylib 0x35ba1c18 _pthread_start + 316 12 libsystem_c.dylib 0x35ba1ad4 thread_start + 4
日期/时间:2011年11月8日15:09:01.410 -0500 操作系统版本:iPhone OS 5.0(9A334) 报告版本:104
异常类型:EXC_BAD_ACCESS(SIGSEGV) 异常代码:KERN_INVALID_ADDRESS at 0x00000034 崩溃的线程:4
线程4名称:WebThread 线程4崩溃: 0 ??? 0x00000034 0 + 52 1 CoreFoundation 0x3537a226-[NSObject performSelector:withObject:] + 38 2 Foundation 0x32ce2752 __NSThreadPerformPerform + 346 3 CoreFoundation 0x353efafe __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10 4 CoreFoundation 0x353ef2ca __CFRunLoopDoSources0 + 210 5 CoreFoundation 0x353ee070 __CFRunLoopRun + 648 6 CoreFoundation 0x353714d8 CFRunLoopRunSpecific + 296 7 CoreFoundation 0x353713a0 CFRunLoopRunInMode + 100 8 WebCore 0x324c912a _ZL12RunWebThreadPv + 398 9 libsystem_c.dylib 0x35ba1c18 _pthread_start + 316 10 libsystem_c.dylib 0x35ba1ad4 thread_start + 4
3个回答

7
我看到您的设备运行的是iOS 5.0。 您加载的文件是Office文档(docx,xls)吗?
如果是这样,那么您的情况与我的相同。这个问题只会在系统5.0上出现(我用的是iPad和iPad 2),并且当您尝试在UIWebView对象完成文件加载之前停止它时发生。不管是通过调用stopLoading还是loadRequest
对于txt文件则不会出现此问题。
如果确实出现了这种情况,它是从WebThread线程开始的,起始代码如下:
#1  0x34912158 in -[QuickLookHandleAsDelegate connection:didReceiveData:lengthReceived:] ()

并跳转到一些随机指针,例如:

#0  0x00000010 in 0x00000010 ()

1
是的,这正是我所看到的,我还从更多的测试中注意到它只发生在Office文档中。您知道这个错误是否已经提交给苹果了吗? - Steve
2
我向苹果公司报告了这个错误,他们称这是一个已知的问题,并正在努力修复。希望在iOS 5.1发布时可以得到解决。 - Steve
这个 bug 在 iOS 5.1 或 iOS 6.0 中是否已经修复?你能提供你报告的 bug 的链接吗? - Perseus
苹果的漏洞报告不对公众开放。只有苹果和创建漏洞报告的开发者账户才能查看。我的漏洞报告被关闭了,因为它是一个重复的报告。被认为是重复报告的漏洞报告状态仍然显示为“打开”,但这是我所能看到的全部内容。我无法查看该漏洞报告,因为它不是由我创建的。 - Steve
iOS 5.1中的错误没有被修复,似乎在iOS 6中已经修复。 - jjxtra
显示剩余2条评论

4
要进一步解释@K1w1Geek的答案,问题可能是用户在尝试发送委托回调之前关闭了Web视图,导致崩溃,因为该对象不存在。这不一定与加载特定文档类型有关,因为我在浏览Salesforce网站时也遇到了这个崩溃情况。
因此,如果您有一个关闭按钮,请尝试在关闭之前停止加载并将委托设置为nil:
- (IBAction)btnCloseWebviewTap:(id)sender{
    [_webView stopLoading];
    _webView.delegate = nil;
    [self dismissViewControllerAnimated:YES completion:nil];
}

2

如果您的UIWebView在后台运行,请检查您的UIWebViewDelegate委托是否仍然有效(即未被释放)。这个问题可能是由于Webview尝试使用已释放的委托调用您的委托而引起的。

- (void)webViewDidFinishLoad:(UIWebView *)webView;

加载完成后在后台执行。

是的,我已经检查过了,这不是问题所在。我的委托要么一直存在,要么在释放委托之前将webView.delegate指针清零。 - Steve
你能提供一些源代码吗?很难说出现了什么问题。 - Piotr

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