Освобождение ресурсов iOS UIWebView после использования
Наш главный экран нашего приложения (и, следовательно, первый, который видят все пользователи) имеет несколько разделов, большинство из которых содержат различные веб-просмотры, которые пользователь может открыть. Это увеличивает объем использования памяти только с 26 МБ до 85 МБ или даже больше (после открытия всех различных веб-просмотров).
Проблема, которую мы обнаружили, заключается в том, что, как только они закрыты, все ресурсы веб-страниц, по-видимому, хранятся в памяти (используемая память едва уменьшает, возможно, несколько MB).
Я хотел бы освободить ресурсы, которые веб-браузер должен был открыть, потому что в дальнейшем есть очень требовательный раздел нашего приложения, которому требуется большая память и полностью сбой приложения, если вы случайно не просматриваете несколько этих веб-просмотров раньше.
Я нашел несколько вариантов в Интернете, но ни один из них не работал до сих пор. Такие вещи, как:
// 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;
)
Изменить: Я только что создал проект с нуля, добавил веб-просмотр и кнопку, которая загружает другую веб-страницу каждый раз, когда я нажимаю на нее, что, в свою очередь, увеличивает использование памяти. Я также добавил кнопку, которая уничтожит веб-просмотр при нажатии и, угадайте, что, память остается прежней, как будто она не освобождает ресурсы.
Ответы
Ответ 1
Прошло несколько месяцев с тех пор, как я задал этот вопрос, и, похоже, никто не знает о какой-либо работе, поэтому я просто отвечаю, чтобы дать ему некоторое закрытие и, к сожалению, плохие новости тому, кто имеет эту же проблему.
Мы продолжали пытаться бороться с этой проблемой в течение нескольких дней и, поговорив с некоторыми людьми, которые каким-то образом намекнули нам, что мы не имеем к этому никакого отношения (это просто другой процесс, который заботится обо всем, к которому у нас нет доступа) мы решили ограничить доступ к веб-просмотру на страницы, сделанные на заказ.
Например, у нас были разделы новостей, которые открывали веб-сайты в Интернете. То, что мы закончили, - это открытые пользовательские веб-страницы, в которых содержится название, тело и изображение, связанное с новостями (которое все еще добавляет к использованию памяти ресурсов, но нам удалось сохранить его в небольшом формате, который потребует тысячи новости, которые будут открыты, чтобы быть в опасности). Я знаю, не идеальный.
Мне все же хотелось бы увидеть конструктивные ответы на этот вопрос, будь то решение, обходной путь или любая идея, которая может помочь будущим пользователям с этой же проблемой выяснить, как с этим бороться.
Ответ 2
вы должны прочитать эту статью от Джейсона Бейкера,
http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/
Он создал category
, который действительно помог мне сократить объем памяти UIWebView.
вам просто нужно вызвать две строки после добавления категории
-(void) dealloc
{
[self.webview cleanForDealloc];
self.webview = nil;
[super dealloc];
}
Ответ 3
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)
}
}
}