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

Ios 在UIWebView中加载包含许多YouTube视频的HTML文件时,应用程序会收到内存警告并崩溃,ios,memory-management,uiwebview,Ios,Memory Management,Uiwebview,我正在我的应用程序中使用UIWebView。它通常工作正常,但有一种情况,应用程序收到内存警告,最终崩溃 我用以下内容加载内容: [self.webView loadHTMLString:htmlString baseURL:baseURL]; 在一个例子中,htmlString包含超过25个YouTube视频(这不是我的想法,而是我收到的网页)。因此,在这种情况下,应用程序会收到一些内存警告,并最终崩溃 我如何处理这种情况?是否可以通过不同的步骤加载HTML文件 我不知道这是否与此有关,但我

我正在我的应用程序中使用
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);
}
非常感谢


Carlos

一个HTML页面中有25个youtube视频似乎太多了:内存被填满,应用程序被关闭


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

严峻的形势。如果您确信您的代码不是原因(使用仪器检查泄漏);那么你的下一个最佳选择可能是尽量避免崩溃。我想到了一些可能性:

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

if (self.webView.loading) {
    [self.webview stopLoading];
    //inform user page cannot be fully loaded.
}
2) 如果这不起作用,您可能可以在
UIWebViewDelegate
webView:shouldStartLoadWithRequest:navigationType:
返回NO
,然后出现内存警告,阻止页面继续获取大量资源

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


希望其中一个能起作用。你能分享让你崩溃的页面吗?听起来对测试很有帮助!此外,你应该向苹果公司提交rdar,以防他们想在较低级别上解决这个问题。

来个小把戏怎么样。获取页面的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];

是的,我知道。但这是我收到的文件。。。而且它不容易修改,因为我无法控制我收到的HTML内容。它是rss提要的内容。如果它有一个结构,你可以解析它并按你需要的方式处理。设想一个rss阅读器一次显示5个条目。。。这当然是可行的。问题是我从不同的来源(不同的rss提要)获取数据,每个来源都有不同的结构。即使来自每个提要的不同新闻也可能不同(一个完全不同的html文件),谢谢Dave!我会试试你的建议。不幸的是,我试图加载的html来自rss提要,现在,它已经从提要中消失了。。。如果我再次发现问题,我会尝试你的建议!