2014-01-16 4 views
26

На главном экране нашего приложения (и, следовательно, первом, что видно всем пользователям) есть несколько разделов, большинство из которых содержат различные веб-просмотры, которые пользователь может открыть. Это увеличивает использование памяти с 26 до 800 МБ или даже больше (после открытия всех различных веб-просмотров).Освобождение ресурсов iOS UIWebView после использования

Проблема, которую мы обнаружили, заключается в том, что, как только они закрыты, все ресурсы веб-страниц, по-видимому, хранятся в памяти (используемая память едва уменьшает, возможно, несколько МБ).

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

Я нашел несколько вариантов в Интернете, но ни один из них не работал до сих пор. Такие вещи, как:

// Try to clean used webview 

[self.webView loadHTMLString:@"" baseURL:nil]; 
[self.webView stopLoading]; 
self.webView.delegate = nil; 
[self.webView removeFromSuperview]; 
self.webView = nil; 

Они практически не влияют на использование памяти. Здесь что-то не хватает? Я уже проверил, что у меня нет никаких утечек, что будет держать WebView открыт, я уже освободив только ссылку на него, что у меня есть (self.webView = nil;)

Edit: Я только что создал проект с нуля, добавил webview и кнопку, которая загружает другую сеть каждый раз, когда я нажимаю на нее, что, в свою очередь, увеличивает использование памяти. Я также добавил кнопку, которая будет уничтожать веб-просмотр при нажатии и, угадайте, что, память остается прежней, как будто она фактически не освобождает ресурсы.

+0

Вы используете ARC? Если вы не используете ARC, вам нужно вызвать выпуск на веб-просмотре. – Ankush

+0

@Ankush да, я благодарю anyways – h4lc0n

+1

Возможно, я неправильно понял характер вашего вопроса, но я хотел бы предложить изменить архитектуру контроллера, чтобы иметь только один экземпляр UIWebView, это действительно тяжеловесный, но очень выразительный и автономный пользователь элемент. Вы можете добавить серверный прокси/агрегатор, который загружает все ваши виджеты в этом веб-представлении. Позже вы могли поймать события javascript и применить свою логику. – voromax

ответ

16

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

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

Например, у нас были разделы новостей, которые открывали веб-страницы в Интернете. То, что мы закончили, - это открытые пользовательские веб-страницы, в которых содержится название, тело и изображение, связанное с новостями (которое все еще добавляет к использованию памяти ресурсов, но нам удалось сохранить его в небольшом формате, который потребует тысячи новости, которые будут открыты, чтобы быть в опасности). Я знаю, не идеальный.

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

+0

У меня такая же проблема при загрузке многих изображений в UIWebView, у меня есть поиск, но не найти действительно решение. Когда загрузка контента в UIWebView увеличивает память и не освобождается до обновления/повторного открытия приложения. –

+0

У меня тоже есть эта проблема. Действительно плохо, что с этим ничего нельзя сделать. У меня есть только один веб-просмотр, но с видео. Я пробовал все, что рекомендуется здесь, на SO, и память просто продолжает расти. В конце концов, после просмотра большого количества видео приложение падает и заканчивается. :( – BlueVoodoo

+0

Вы когда-нибудь узнали об этом больше? Я точно вижу то же самое поведение. После просмотра URL-адресов память продолжает загружаться до тех пор, пока приложение не выйдет из строя. Я сделал все, что я видел до сих пор в сети, но я держу свои пальцы скрещенными, там что-то я пропустил там .... –

7

вы должны прочитать эту статью от Jason Baker,

http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/

Он создал category, который действительно помог мне валовый объем памяти UIWebView.

вы просто должны вызвать две строки после добавления категории

-(void) dealloc 
{ 

    [self.webview cleanForDealloc]; 
    self.webview = nil; 
    [super dealloc]; 

} 
+2

Да, я уже это пробовал. Вот где я получил варианты, чтобы попробовать, но на самом деле это не работает. Я дам ему еще один проект с чистым проектом, чтобы понять, не изменилось ли это. Спасибо – h4lc0n

1
override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    categoryWebView.stopLoading() 
    categoryWebView.removeFromSuperview() 
    categoryWebView = nil 

    URLCache.shared.removeAllCachedResponses() 
    URLCache.shared.diskCapacity = 0 
    URLCache.shared.memoryCapacity = 0 
    if let cookies = HTTPCookieStorage.shared.cookies { 
     for cookie in cookies { 
      HTTPCookieStorage.shared.deleteCookie(cookie) 
     } 
    } 
} 
Смежные вопросы