Ios 在iPad上显示大PDF时UIWebView泄漏

Ios 在iPad上显示大PDF时UIWebView泄漏,ios,ipad,pdf,memory-leaks,uiwebview,Ios,Ipad,Pdf,Memory Leaks,Uiwebview,这里有一些奇怪的行为,我希望有人能确认这是一个已知的bug,或者建议解决方法 我的iPad应用程序需要显示一些大的PDF(~7mb,图形量大)。阻力最小的路径当然是UIWebView,但我的应用程序在显示了一些PDF后崩溃。我在一个新项目中隔离了该行为,并在其上运行了工具 以下是结果。它们似乎表明UIWebView中正在发生严重泄漏 基本代码,在最小视图控制器中: -(IBAction)doPresent:(UIView *)sender { NSURL *url = [[NSBundle

这里有一些奇怪的行为,我希望有人能确认这是一个已知的bug,或者建议解决方法

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

以下是结果。它们似乎表明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后崩溃了

在Instruments(allocations)下运行它产生了以下有趣的情节:

我注意到的模式是,如果我显示一个PDF并在不滚动文档的情况下关闭它,它将按预期发布,并且泄漏量最小。但如果我触摸它并滚动,哪怕是一点点,内存也不会被释放。查看后续PDF似乎不会重用任何浪费的内存,但每个PDF都会分配更多的内存。在模拟器中运行并触发内存警告也不会恢复此内存

当使用量达到~25mb时,程序得到
kill-9
'd。在我看来,这似乎很低,表明除了应用程序内存之外,还有其他一些资源正在泄漏

这是在iPad1上,运行4.3,刚刚重启

想法?变通办法?我这方面的愚蠢疏忽?

我认为用户:“drawnonward”说明了一些问题。查看代码,按下每个按钮,您不仅可以alloc和init创建一个新的webview,还可以创建一个新的UIViewController和一个新的UINavigationController。除非每次按下按钮时绝对有必要创建这些对象的新实例,否则应重新编码,使每个对象只有一个实例,然后按下每个按钮将新内容加载到webview中


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

好吧,苹果公司终于在bug报告中回复了我,他们发现了这个bug,并声称它在最新的ios 5.x版本中得到了修复。我们拭目以待。

在我的例子中,我总是从webview中的PDF返回。如果您使用类似以下内容将scoll调到顶部:

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

它似乎解决了这个问题

看起来您每次都在创建一个新的UIWebView。如果循环使用相同的视图,是否会有所不同?我们遇到的一个模糊相关问题的解决方案是在关闭任何web视图之前加载一个空页面,如
about:blank
。我没有尝试过about:blank技巧。这可能值得一看。回收web视图在某种程度上缓解了问题,但并不能消除问题……但我不会泄露它们,这就是问题所在。使用UINavigationControllers作为一次性使用是一种正常的、苹果认可的模式,我在其他地方使用过,效果很好,只要你自己清理干净就安全了。我不记得说过你泄露了它们。我想指出的一点是,通过循环使用NavController、ViewController和WebView,您可以最小化分配,这(理论上)也可以解决您的问题。将对象设置为自动释放时,它不会在处理完对象后立即释放,而是将对象添加到池中。对象将一直保留在内存中,直到池中的水被排干。无论如何,希望苹果真的已经为iOS 5解决了这个问题。我也有同样的问题,并且尝试了多种不同的方式来呈现PDF,包括Leaves类。结果总是一样的,最终应用程序在加载8-9个PDF文件后会崩溃。在我看到你的帖子后,迫不及待地想在IOS 5上试用。问题链接和苹果的答案?我仍然面临着IOS 7.1.1版iPhone 5S内存泄漏的问题。我不认为苹果已经解决了这个问题。我在iOS 9.3.2上也遇到了同样的问题。当我关闭封闭的UIViewController时,我在iPad上遇到了UIWebView崩溃的类似问题,当时由于“惯性”效应,内容仍在积极滚动。这个给我修好了。