在一些相对安全(对我来说)修改后,应用程序开始崩溃一些WebKitLegacy的东西。我在Fabric中看到很多崩溃,但无法找到稳定的重现步骤。 有谁知道什么会导致这些崩溃?请参阅附图。
某些应用程序屏幕使用UIWebView显示内容 - 我认为问题出在那里。
答案 0 :(得分:2)
UIWebView EXC_BAD_Address ...应用程序收到信号 首先,您应该考虑webView.delegate = nil。 但是在哪里?
我的经历:
- (void)dealloc{
/*
Important
Before releasing an instance of UIWebView for which you have set a delegate,
you must first set the UIWebView delegate property to nil before disposing of the UIWebView instance.
This can be done, for example, in the dealloc method where you dispose of the UIWebView.
*/
if (_webView.loading) {
[self.webView stopLoading];
}
_webView.delegate = nil;
}
如果
ViewController
是另一个ViewController
的孩子,则可以 触发从父级中删除ViewController
的视图ViewController
带动画的视图。与此同时,你可以 从其父级中删除ViewController
并将其引用清零。 此时ViewController
将为,viewWillDisappear
将为 永远不会被称为,这意味着** WebView委托永远不会被清除 ** 使用dealloc并确保始终清除WebView
。
答案 1 :(得分:1)
据我记忆,当Webview收到更新时(例如,来自嵌入图像的响应),该信号会弹出,但它无法呈现,因为它没有被使用主线程了。这意味着,当没有显示ViewController时。
如果是这种情况,您应该可以通过加载包含大量内容的网页(例如,某些在线报纸,如http://edition.cnn.com/)并在启动后立即解除网页浏览来重现该问题通过按下/弹出另一个ViewController来加载。
如何修复它:确实,你需要调用你提到的方法:
select * from user_tables where table_name='YOURTABLENAME';
但是,这样做的地方是webview.delegate = nil;
[webview stopLoading];
方法,而不是viewWillDisappear
。原因很简单:在ViewController即将失去对主线程的控制的确切时刻调用dealloc
。但是,当VC即将发布到堆时,将调用viewWillDisappear
。这可能发生在几秒钟之后,给应用程序一些宝贵的时间来崩溃,或者根本不会被调用。移动这两种方法应该可以解决问题。