在UIWebView中加载包含许多YouTube视频的HTML文件时,应用会收到内存警告和崩溃

时间:2013-01-14 18:26:28

标签: ios memory-management uiwebview

我在我的应用中使用UIWebView。它通常运行良好,但有一种情况是应用程序收到内存警告并最终崩溃。

我用这个加载内容:

[self.webView loadHTMLString:htmlString baseURL:baseURL];

有一个案例htmlString内容超过25个YouTube视频(这不是我的想法 - 这是我收到的网页)。因此,在这种情况下,应用程序会收到一些内存警告,最后崩溃。

我该如何处理这种情况?是否可以通过各种步骤加载HTML文件?

我不知道这是否与它有关,但我正在设置UIWebView大小 - 以及包含Web视图的滚动视图的内容大小 - 动态。这是代码:

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    // Adaptamos las vistas al contenido y ocultamos el indicador de actividad

    // Ponemos el webView del tamaño justo del contenido

    CGRect frame = webView.frame;
    // Hace falta cambiar la height porque si no, no coge los cambios. Visualmente no se ve diferencia
    frame.size.height = 1;
    webView.frame = frame;
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
    frame.size.height = fittingSize.height;
    webView.frame = frame;

    // Movemos el botón y lo ponemos donde acabe el webView
    CGRect buttonFrame = self.visitSiteButton.frame;
    buttonFrame.origin.y = frame.origin.y + frame.size.height + 20;
    self.visitSiteButton.frame = buttonFrame;

    // Ampliamos el contenSize del scrollview general para que quepa todo el webView
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.visitSiteButton.frame.origin.y + self.visitSiteButton.frame.size.height + 10);
}

非常感谢,

卡洛斯

3 个答案:

答案 0 :(得分:3)

一个顽皮的小技巧怎么样?使用以下代码获取页面的html:

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    NSURLResponse * response = nil;
    NSError * error = nil;
    NSData * data  = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString* newStr = [[NSString alloc] initWithData:theData
                                     encoding:NSUTF8StringEncoding];

使用正则表达式查找视频元素并替换为自定义图像超链接标记>。 将html字符串显示为:

[webView loadHTMLString: baseURL:nil];

答案 1 :(得分:2)

艰难的情况。如果您确信您的代码不是原因(使用仪器检查泄漏);那么你的下一个最好的选择可能是尝试避免崩溃。我想到了一些可能性:

1)当您收到内存警告时,您可能会:

if (self.webView.loading) {
    [self.webview stopLoading];
    //inform user page cannot be fully loaded.
}

2)如果这不起作用,您可以在return NO UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:之后发出内存警告,以阻止该网页继续吸收大量资源。< / p>

3)也许作为最后的手段,停止webview加载,将其从视图中删除,然后释放它。

希望其中一个会奏效。你能分享那个让你崩溃的页面吗?听起来有助于测试目的!另外 - 你应该向Apple提交一份报告,以防他们想在较低级别解决这个问题。

答案 2 :(得分:0)

似乎单个HTML页面中的25个youtube视频太多:内存已满,应用程序被终止。

如果您不愿意修改HTML页面的设计,我怀疑还有很多工作要做。但如果你愿意,那么有很多选择。例如,您可以实现HTML的延迟加载(通过javascript),以便只显示少数视频(如在UITableView中)。或者您可以将与youtube链接的HTML代码替换为其他“更轻”的代码,然后让用户加载新的UIWebView以观看特定视频。等