Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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)
        }
    }
}