UIWebView утечка при отображении больших PDF-файлов на iPad - PullRequest
5 голосов
/ 19 марта 2011

Вот несколько странное поведение, которое, я надеюсь, кто-то может подтвердить, является известной ошибкой или предложить обходной путь.

В моем приложении для iPad должны отображаться несколько больших файлов PDF (~ 7 МБ и с большим количеством графики). Путь не менееСопротивление - это, конечно, 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-файлов не используется повторно потраченная память, но каждый выделяет больше своей.Запуск в симуляторе и запуск предупреждений памяти также не возвращает эту память.

Когда использование достигло ~ 25 МБ, программа получила kill -9 'd.Мне кажется, что это мало, предполагая утечку какого-то другого ресурса, кроме памяти приложения.

Это на iPad 1, под управлением 4.3, только что перезагружен.

Идеи?Обходные?Глупые упущения с моей стороны?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Что ж, Apple наконец-то ответила мне на сообщение об ошибке, и они распознают ошибку и утверждают, что она исправлена ​​в последних сборках ios 5.x. Посмотрим.

1 голос
/ 11 октября 2011

В моем случае я всегда возвращаюсь из PDF в веб-просмотре.Если вы прокрутите вверх, используя что-то вроде этого:

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

Кажется, это решает проблему

1 голос
/ 15 июля 2011

Я думаю, что пользователь: "drawonward" что-то значит. Глядя на свой код, с каждым нажатием кнопки вы не только выделяете и запускаете новое веб-представление, но также новый UIViewController и новый UINavigationController. Если абсолютно не обязательно создавать новый экземпляр каждого из этих объектов при каждом нажатии кнопки, вам следует перекодировать так, чтобы у вас был только один экземпляр каждого объекта, а затем при нажатии каждой кнопки загружать новый контент в веб-просмотр. .

Я думаю, что есть действительно хороший шанс, что это решит вашу проблему.

...