我在我的应用中使用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);
}
非常感谢,
卡洛斯
答案 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以观看特定视频。等