这是一些奇怪的行为,我希望有人可以确认这是一个已知错误,或建议解决方法。
我的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的六个左右视图之后崩溃。
在乐器(分配)下运行它产生了这个有趣的情节:
我注意到的模式是,如果我显示PDF并将其解除而不滚动文档,它会按预期释放,泄漏最少。但是,如果我触摸它并滚动,即使是一点点,内存也不会被释放。查看后续PDF似乎没有重用任何浪费的内存,但每个都分配了更多自己的内存。在模拟器中运行并触发内存警告也不会恢复此内存。
当使用量达到〜25mb时,程序得到kill -9
'd。这对我来说似乎很低,暗示除了app内存之外还有一些其他资源被泄露。
这是在运行4.3的iPad 1上重新启动。
想法?解决方法?我的愚蠢遗漏?
答案 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];
}
似乎解决了这个问题