iphone - 如何在 viewWillDisappear 中安全地关闭正在加载的 UIWebView?

标签 iphone cocoa-touch uiwebview

我有一个包含 UIWebView 的 View ,它正在加载谷歌地图(所以有很多 JavaScript 等)。我遇到的问题是,如果用户在 Web View 完成加载之前点击导航栏上的“后退”按钮,我不清楚如何整齐地告诉 Web View 停止加载然后释放它,而不会得到发送到已释放实例的消息。我也不确定 Web View 是否喜欢其容器 View 在完成之前消失(但如果用户在加载之前点击后退按钮,我别无选择)。

在我的 viewWillDisappear 处理程序中,我有这个

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

这似乎可以处理大多数情况,因为将委托(delegate)置零会阻止它向我的 View Controller 发送 didFailLoadWithError 。但是,如果我在 View 的 dealloc 方法中释放 Web View ,有时(间歇性地)我仍然会收到发送到已释放实例的消息,这似乎与实际页面中运行的 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,点击其他 View 导航栏上的后退按钮将弹出标题,但不会弹出 View 。换句话说,我在堆栈上留下了 View n 的标题,但显示的 View 仍然是 View n+1 (结果是你被困在这个屏幕上,无法返回到 Root View - 你可以转到其他方向,即推送更多 View 并弹回未正确弹出的 View ,只是不弹回 Root View 。唯一的出路是退出应用程序)。在其他时候,对相同 View 进行相同的推送和弹出序列效果很好。

这个特别的让我发疯。我认为这可能与加载 Web View 之前 View 消失有关,即在这种情况下,我怀疑它可能会在内存上乱写乱画并混淆 View 堆栈。或者,这可能是完全不相关的,并且是其他地方的错误(我从来无法在调试构建模式下重现它,只有当我无法使用 gdb 观看它时,它才会在发布build设置中发生:-)。从我的调试运行来看,我认为我没有过度发布任何东西。而且我似乎只有在某个时候点击了具有 Web View 的 View 才能触发它,并且此后不会立即发生。

最佳答案

对此的一个变体应该可以解决泄漏和僵尸问题:

- (void)loadRequest:(NSURLRequest *)request
{
    [self retain];
    if ([webView isLoading])
        [webView stopLoading];
    [webView loadRequest:request];
    [self release];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    [self retain];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self release];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [self release];
}

- (void)viewWillDisappear
{
    if ([webView isLoading])
        [webView stopLoading];
}

- (void)dealloc
{
    [webView setDelegate:nil];
    [webView release];
    [super dealloc];
}

关于iphone - 如何在 viewWillDisappear 中安全地关闭正在加载的 UIWebView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/789984/

相关文章:

ios - 从门户中删除配置文件是否会导致应用程序过期?

iPhone 媒体查询不重定向到移动样式表

ios - pushViewController AlphaComponent 不工作

iphone - 使用 __weak 属性将参数传递给 block 会导致内存泄漏吗?

ios - 访问 LazyTableImages 中的 imageDownloadsInProgress

ios - 对于哪些用例,可以选择 tableView :didSelectRowAtIndexPath: rather than prepareForSegue:sender:?

ios - html5 表单验证在 iOS UIWebView 中不起作用

iphone - 对象界面布局?

javascript - 在 UIWebView 上加载 javascript

javascript - 调整 UIWebView 文本的大小