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
并设置setDelegate
在stopLoading
setDelegate
如果ViewController是另一个ViewController的孩子 ,你可以通过一个animation从ViewController的父 视图中删除ViewController的视图 。 与此同时,你可以从它的父母删除ViewController和
nil
的引用 。 在这一点上,ViewController
将是nil
和viewWillDisappear
将永远不会被调用 ,这意味着WebView委托将永远不会被清理使用
dealloc
并确保您的WebView始终被清理 。
3.确保在不animation的情况下将webview
subviews
的ContentOffset
设置为ContentOffset
在一些版本的iPad,而webview滚动,如果你closures父视图
CGPointZero
没有设置ContentOffsetCGPointZero
这种问题会来
所以最好在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
UIWebView
的delegate
使用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] }