当前位置:  开发笔记 > Android > 正文

UIWebView EXC_BAD_ACCESS崩溃

如何解决《UIWebViewEXC_BAD_ACCESS崩溃》经验,为你挑选了3个好方法。

我遇到了使用UIWebView的应用程序崩溃.通常是在页面没有完全加载并且UIWebView被发送到stopLoading选择器时.或者当UIWebView完全加载页面时.我有EXC_BAD_ACCESS.堆栈看起来像这样:

#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(不是可可触摸)WebView.我怀疑UIWebView或其委托有问题.但我无法设置断点来观察它们.请告知我如何在这种情况下获得更多信息.



1> Ondrej..:

您必须在离开视图之前停止加载webView并删除委托:

// 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方法中完成此操作.


在ios 6中使用带有ARC的dealloc方法(不调用超级或任何内存释放代码) - 在ios 6中不推荐使用viewWillUnload.

2> bbum..:

尝试启用NSZombie并查看是否有太快发布的内容.

可能是您正在取消视图的加载,然后立即拆除视图层次结构,导致在UIWebView完成之前释放某些内容.

在这种情况下,回溯看起来非常像是一个早期发布的委托.委托关系通常很弱,并且缺少GC,是悬挂引用的一个很好的来源,导致崩溃看起来像这样.



3> jturolla..:

查看Will Disappear是接受答案的工作选项:

// ARC
- (void)viewWillDisappear:(BOOL)animated{
    [self.webView setDelegate:nil];
    [self.webView stopLoading];
}

这适用于iOS 6完美.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有