问题描述
我遇到使用 UIWebView 的应用程序崩溃.通常是在页面没有完全加载并且 UIWebView 被发送 stopLoading 选择器的时候.或者当 UIWebView 完全加载页面时.我有 EXC_BAD_ACCESS
.堆栈如下所示:
I'm experiencing crashes of an app that uses UIWebView. Usually it's when page is not fully loaded and UIWebView is sent stopLoading selector. Or when UIWebView fully loaded page. I've got EXC_BAD_ACCESS
. Stack looks like this:
#0 0x95bb7688 in objc_msgSend
#1 0x30a671db in -[UIWebView webView:decidePolicyForNavigationAction:request:frame:decisionListener:]
#2 0x3024a10d in __invoking___
#3 0x30249ff8 in -[NSInvocation invoke]
#4 0x358ab160 in HandleDelegateSource
#5 0x302452c1 in CFRunLoopRunSpecific
#6 0x30244628 in CFRunLoopRunInMode
#7 0x32044c31 in GSEventRunModal
#8 0x32044cf6 in GSEventRun
#9 0x309021ee in UIApplicationMain
#10 0x0000239c in main at main.m:13
对我来说最奇怪的是 webView:decidePolicyForNavigationAction:request:frame:decisionListener:
选择器发送到 UIWebView,因为在 UIWebView 文档中没有这样的选择器!仅适用于 Cocoa(不是 cocoa touch)WebView.我怀疑 UIWebView 或其委托有问题.但我无法设置断点来观看它们.请告知我在这种情况下如何获得更多信息.
for me most strange thing here is webView:decidePolicyForNavigationAction:request:frame:decisionListener:
selector sent to UIWebView, because there is no such selector in UIWebView documentation! Only for Cocoa (not cocoa touch) WebView.
I suspect that there is something wrong with UIWebView or its delegate. But I can't set breakpoint to watch them. Please advise how I can get more info in this situation.
推荐答案
你必须在离开视图之前停止加载 webView 并移除委托:
You have to stop loading the webView and remove the delegate before leaving the view:
// ARC (correct solution)
- (void)dealloc {
[_webView setDelegate:nil];
[_webView stopLoading];
}
// non ARC
- (void)dealloc {
[webView setDelegate:nil];
[webView stopLoading];
[webView release];
[super dealloc];
}
// ARC (older solution)
- (void)viewWillUnload {
[webView setDelegate:nil];
[webView stopLoading];
}
Apple 文档的内容是:重要提示在释放您已为其设置委托的 UIWebView 实例之前,您必须首先将其委托属性设置为 nil.例如,这可以在您的 dealloc 方法中完成.
What Apple documentation is saying: Important Before releasing an instance of UIWebView for which you have set a delegate, you must first set its delegate property to nil. This can be done, for example, in your dealloc method.
这篇关于UIWebView EXC_BAD_ACCESS 崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!