8

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

我用这个加载内容:

[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);
}

非常感谢,

卡洛斯

4

3 回答 3

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];
于 2013-01-22T15:39:38.770 回答
2

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

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

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

2)如果这不起作用,您可以return NO遵循UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:内存警告来阻止页面继续拉入大量资源。

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

希望其中之一能奏效。你能分享让你崩溃的页面吗?听起来对测试目的很有帮助!此外 - 您应该向 Apple 提交 rdar,以防他们希望在较低级别解决此问题。

于 2013-01-20T17:04:31.507 回答
0

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

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

于 2013-01-14T18:35:30.160 回答