ios:用于Webview委托的EXC_BAD_ACCESS

我有一个情况,我正在尝试解决这些Crashlytics的问题,我有这个崩溃日志

Thread : Crashed: com.apple.main-thread 0 libobjc.A.dylib 0x34217f46 objc_msgSend + 5 1 UIKit 0x29a2d5a3 -[UIWebView webView:decidePolicyForNavigationAction:request:frame:decisionListener:] + 182 2 CoreFoundation 0x2630cad4 __invoking___ + 68 3 CoreFoundation 0x26239645 -[NSInvocation invoke] + 300 4 CoreFoundation 0x2623d0c7 -[NSInvocation invokeWithTarget:] + 50 5 WebKitLegacy 0x326d9261 -[_WebSafeForwarder forwardInvocation:] + 224 6 CoreFoundation 0x2630b62f ___forwarding___ + 354 7 CoreFoundation 0x2623d008 _CF_forwarding_prep_0 + 24 8 CoreFoundation 0x2630cad4 __invoking___ + 68 9 CoreFoundation 0x26239645 -[NSInvocation invoke] + 300 10 WebCore 0x31c02729 HandleDelegateSource(void*) + 100 11 CoreFoundation 0x262cefbf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 12 CoreFoundation 0x262ce461 __CFRunLoopDoSources0 + 364 13 CoreFoundation 0x262cca35 __CFRunLoopRun + 772 14 CoreFoundation 0x2621a3b1 CFRunLoopRunSpecific + 476 15 CoreFoundation 0x2621a1c3 CFRunLoopRunInMode + 106 16 GraphicsServices 0x2d801201 GSEventRunModal + 136 17 UIKit 0x2988443d UIApplicationMain + 1440 18 abc 0x0030dcd7 main (main.m:14)

我可以理解,它的一些callbackwebview委托和坏的过剩已经发生,所以纠正这一点,我处理代表通过

 [self.webview stopLoading]; self.webview.delegate =nil; 

在所有的课程中,我可以看到这个崩溃。 你可以请指教我什么可能出错和一些办法来纠正这一点。

期待您的回应。

谢谢Ankit

以下可能是这种情况

  • 用户被呈现一个UIWebView的屏幕
  • UIViewController网页开始下载时, UIViewController设置self
  • 用户退出屏幕
  • UIViewController取消分配 UIWebView完成加载和发送我完成加载消息到它的委托

要么

当webview对象不再具有悬挂指针效果时,会调用其他一些委托方法

1.一定要确保在离开视图之前停止加载webView删除委托

释放已设置委托的UIWebView的实例之前,必须先将其委托属性设置为nil 。 这可以在你的dealloc方法中完成

这里是参考

 // If ARC is used - (void)dealloc { [_webView setDelegate:nil]; [_webView stopLoading]; } // If ARC is not used - (void)dealloc { [webView setDelegate:nil]; [webView stopLoading]; [webView release]; [super dealloc]; } // ARC - Before iOS6 as its deprecated from it. - (void)viewWillUnload { [webView setDelegate:nil]; [webView stopLoading]; } 

2.确保你没有stopLoading并设置setDelegatestopLoading setDelegate

如果ViewController是另一个ViewController的孩子 ,你可以通过一个animation从ViewController的父 视图中删除ViewController的视图 。 与此同时,你可以从它的父母删除ViewController和nil引用 。 在这一点上, ViewController将是nilviewWillDisappear永远不会被调用 ,这意味着WebView委托将永远不会被清理

使用dealloc并确保您的WebView始终被清理

3.确保在不animation的情况下将webview subviewsContentOffset设置为ContentOffset

在一些版本的iPad,而webview滚动,如果你closures父视图CGPointZero没有设置ContentOffset CGPointZero这种问题会来

所以最好在closures之前调用父视图控制器中的以下代码

  for (id subview in webView.subviews){ if ([[subview class] isSubclassOfClass: [UIScrollView class]]){ [subview setContentOffset:CGPointZero animated:NO]; } } 

希望这可以帮助。请随时问你的疑惑。

一般来说,您不应该在UIScrollView对象中embedded UIWebView对象。 如果这样做,可能会导致意外的行为,因为两个对象的触摸事件可能会混淆并被错误地处理。

这里是参考

尝试在ViewController解除分配之前禁用UIWebView的滚动行为

 for (id subview in webView.subviews){ if ([[subview class] isSubclassOfClass: [UIScrollView class]]){ [subview setContentOffset:CGPointZero animated:NO]; } } 

ps Dipen Chudasama的方法是正确的,根据苹果的文档,你应该真的把委托属性设置为零,然后释放webview,假设你已经在dealloc函数中正确释放了webview,但是viewWillDisappear

UIWebViewdelegate使用assign而不是weak 。 所以当webView的控制器被取消分配时,你需要取消delegate

例:

 - (void)dealloc { self.webview.delegate =nil; } 

您是否在Web视图的子类中添加了Web视图? 通常这就是问题,如果是这样,将超类更改为UIView将解决问题。

使用签证的方法首先无你的委托,然后停止加载networking视图可能会帮助你。

喜欢这个。

 [_webView setDelegate:nil]; [_webView stopLoading]; 

按照苹果文档:重要在释放已设置委托的UIWebView实例之前,必须先将其委托属性设置为nil。

使用[侦听器使用]来告诉你的UIWebView处理点击的URL。

 -(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id )listener { [listener use] }