在iPad上显示大型PDF时UIWebView泄露

时间:2011-03-18 21:55:03

标签: ios ipad pdf memory-leaks uiwebview

这是一些奇怪的行为,我希望有人可以确认这是一个已知错误,或建议解决方法。

我的iPad应用程序需要显示一些大型PDF(~7mb和图形密集)。阻力最小的路径当然是UIWebView,但我的应用程序在显示几个后崩溃。我在新项目中隔离了行为,并在其上运行了仪器。

以下是结果。它们似乎表明在UIWebView中发生了严重的泄漏。

基本代码,在最小视图控制器中:

-(IBAction)doPresent:(UIView *)sender
{
  NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%d", [sender tag]]
                                       withExtension:@"pdf"];
  UIWebView *wv = [[[UIWebView alloc] init] autorelease];
  UIViewController *vc = [[[UIViewController alloc] init] autorelease];
  [vc setView:wv];
  UINavigationController *holder = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];

  [self presentModalViewController:holder animated:YES];
  [wv loadRequest:[NSURLRequest requestWithURL:url]];

  UIBarButtonItem *close = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                          target:self
                                                                          action:@selector(doDismiss:)] autorelease];
  [[vc navigationItem] setRightBarButtonItem:close];
}

-(IBAction)doDismiss:(id)sender
{
  [self dismissModalViewControllerAnimated:YES];
}

未图示:包含此VC的主笔尖,其视图以及连接到doPresent:的五个按钮,每个按钮标记为1 ... 5;应用程序包中的1.pdf到5.pdf。运行它并且它可以像您期望的那样工作,除了它在PDF的六个左右视图之后崩溃。

在乐器(分配)下运行它产生了这个有趣的情节: plot of memory usage

我注意到的模式是,如果我显示PDF并将其解除而不滚动文档,它会按预期释放,泄漏最少。但是,如果我触摸它并滚动,即使是一点点,内存也不会被释放。查看后续PDF似乎没有重用任何浪费的内存,但每个都分配了更多自己的内存。在模拟器中运行并触发内存警告也不会恢复此内存。

当使用量达到〜25mb时,程序得到kill -9'd。这对我来说似乎很低,暗示除了app内存之外还有一些其他资源被泄露。

这是在运行4.3的iPad 1上重新启动。

想法?解决方法?我的愚蠢遗漏?

3 个答案:

答案 0 :(得分:2)

好吧,Apple终于在bug报告上找回了我,他们认识到了这个bug,并声称它已经在最新的ios 5.x版本中修复了。我们会看到。

答案 1 :(得分:1)

我认为用户:“drawonward”是关于某事的。查看代码,按下每个按钮,不仅可以分配和初始化新的webview,还可以使用新的UIViewController和新的UINavigationController。除非绝对有必要在每次按下按钮时创建每个对象的新实例,否则应该重新编码,以便每个对象只有一个实例,然后按下每个按钮,将新内容加载到webview中

我认为这很有可能解决您的问题。

答案 2 :(得分:1)

在我的情况下,我总是从webview中的PDF返回。如果你使用这样的东西飙升:

for (UIView *subview in webView.subviews)
{
    if ([subview isKindOfClass:[UIScrollView class]])
        [subview setContentOffset:CGPointZero animated:NO];
}

似乎解决了这个问题