Освобождение ресурсов 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)
        }
    }
}