我有一个包含 UIWebView 的视图,它正在加载谷歌地图(很多 javascript 等)。我遇到的问题是,如果用户在 web 视图完成加载之前点击导航栏上的“后退”按钮,我不清楚如何整齐地告诉 web 视图停止加载然后释放它,而不是发送到已释放实例的消息。我也不确定 web 视图是否喜欢它的容器视图在它完成之前消失(但如果用户在加载之前点击后退按钮,我别无选择)。
在我看来WillDisappear 处理程序我有这个
map.delegate=nil;
[self.map stopLoading];
这似乎可以处理大多数情况,因为取消委托会阻止它将 didFailLoadWithError 发送到我的视图控制器。但是,如果我在视图的 dealloc 方法中释放 Web 视图,有时(间歇性地)我仍然会收到一条消息发送到已释放的实例,这似乎与实际页面中运行的 javascript 有关,例如:
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
如果我只是不发布 webview,那么我就不会收到这些消息,尽管我想我正在泄漏 webview。
如果我不发送“stopLoading”消息,而只是在 viewWillDisappear 中释放 webview,那么我会看到如下消息:
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
可能相关,我有时(再次完全断断续续)得到一个丑陋的 heisenbug,单击其他视图导航栏上的后退按钮会弹出标题,但不会弹出视图。换句话说,我在堆栈上留下了视图 n 的标题,但显示的视图仍然是视图 n+1 (结果是你被困在这个屏幕上,无法回到根视图 - 你可以去另一个方向,即推送更多视图并弹回没有正确弹出的视图,只是不到根视图。唯一的出路是退出应用程序)。在其他时候,相同视图上的相同推送和弹出序列可以正常工作。
这个特别的让我发疯。我认为这可能与加载 Web 视图之前视图消失有关,即在这种情况下,我怀疑它可能会在内存上乱涂乱画并混淆视图堆栈。或者,这可能是完全不相关的并且是其他地方的错误(我从来没有能够在调试构建模式下重现它,它只会在我无法使用 gdb 观看它时发生在发布构建设置中:-)。从我的调试运行来看,我认为我没有过度发布任何东西。而且我似乎只有在我点击了具有 web 视图的视图时才能触发它,并且在那之后它不会立即发生。