uiwebview и огромная потеря памяти - PullRequest
10 голосов
/ 27 августа 2010

У меня проблема с использованием UIWebViews, я видел тот же вопрос здесь, но не было никакого полезного ответа.вопрос здесь: управление памятью UIWebView .Я процитирую это:

Я занимаюсь разработкой приложения, которое интенсивно использует UIWebView.Это приложение генерирует динамически много UIWebViews при загрузке контента с моего сервера.Некоторые из этих UIWebViews довольно большие и содержат много изображений.

Если я использую инструменты для обнаружения утечек, я их не обнаруживаю.Однако выделяется много объектов, и я подозреваю, что это имеет отношение к UIWebViews.

Когда веб-просмотры выпускаются, потому что больше не нужны, кажется, что освобождается не вся память.Я имею в виду, что после запроса к моему серверу приложение создает UITableView и множество веб-просмотров (инструменты говорят о 8Mb).Когда пользователь нажимает назад, все они освобождаются, но использование памяти уменьшается только на 2-3 Мб, и через 5-10 минут использования приложения происходит сбой.

Я создал простое тестовое приложение и имеюте же результаты.

Это табличное представление, я создаю DetailsView следующим образом:

DetailsVC *detailViewController = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil];
detailViewController.n = indexPath.row;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

в DetailsVC У меня есть веб-представление, созданное в IB.Я загружаю HTML следующим образом:

    NSString *urlAddress;
if (self.n == 0)
{
    urlAddress = @"http://www.google.com";
}
else 
{
    urlAddress = @"http://www.yahoo.com";
}

NSURL *url = [NSURL URLWithString:urlAddress];

NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

[self.webView loadRequest:requestObj];

Я также делаю:

- (void)viewDidUnload {
self.webView = nil;
}

Вот так, каждый раз, когда я выбираю любой веб-вид в RootViewController, я теряю 2-3 Мб памяти,Есть ли решение этой проблемы?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

Просто проверьте следующее 1. Вы делаете веб-просмотр как свойство удалить его 2. И введите следующий код в didFinishLaunchingWithOptions в Appdelegate

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];

Я думаю, тогда ваша проблема решена

0 голосов
/ 21 января 2014

Я знаю, что эта ветка немного устарела, но просто для идеи, и чтобы добавить еще несколько важных битов, я хотел бы добавить эти советы, чтобы будущие посетители тоже могли взглянуть на это, и там может быть решена проблема.

  • Вы должны set Cache policy к вашему NSURLRequest объекту и проверить политики, которые игнорируют данные кэша, см. Документацию .

  • Поскольку в вашем коде есть вызов release, я предполагаю, что вы используете ARC, так почему бы вам не вызвать [super dealloc] в viewDidUnload ()?

  • Посмотрите в этой теме, как cleanForDealloc с помощью UIWebView.

  • Это UITableViewController?с кастомными клетками?Попробуйте также освободить (release, removeFromSuperView, установить в nil) их.

Надеюсь, это поможет!

0 голосов
/ 28 августа 2010

Полагаю, что поскольку вы устанавливаете webview = nil, вы теряете шанс выпустить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...