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

Массивная утечка памяти в ios UIWebView

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

<html>
<meta http-equiv="refresh" content="1">
<body>
<div style="border: 1px solid red">
    Content loading
</div><!-- 20mb worth of comments -->
</body>
</html>

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

Я остановил загрузку обновления и попытался отключить веб-просмотр.

Я пробовал loadurl: "about: blank", loadhtml: "", закрыть javascript.

Я также попытался написать рекурсивный removeFromSuperview и removeFromParentViewController, считая, что приватное scrollview в веб-просмотре является проблемой памяти, но эта память никогда не освобождается. Я не могу найти надежный способ закрыть, dealloc webview, когда мы с ним закончим.

Мы жили с медленной скоростью webview, протекающей довольно долгое время, и действительно хотим найти способ гарантировать, что веб-просмотр может быть полностью очищен, когда мы с ним закончим. Недавно мы конвертировали приложение в ARC, которое не меняло скорость памяти.

Я рассматриваю попытку рекурсивного цикла через все объекты в webview и посмотреть, могут ли они быть освобождены. инструменты показывают 20 мб cfdatas, живые, для каждого обновления страницы 20 МБ, но не показывают их как утечки. если я только доставляю заголовок ответа и выполняюсь клиенту urlprotocol, который мы запускаем стабильно, так что был ale, чтобы подтвердить memleaks в остальной части пути данных, но это такой драматический результат тестового примера, который я надеюсь найти решение для проверки memview mem once и для всех.

Есть ли у кого-нибудь лучшие идеи или кто-нибудь попытался перепроверить объекты в uiwebview?

4b9b3361

Ответ 1

Как я избавился от утечки памяти UIWebView, это установить его HTML в пустую строку. Одно место для этого - когда исчезает контроллер вида, содержащий веб-представление:

- (void) viewWillDisappear:(BOOL)animated {
    if (self.isMovingFromParentViewController) {
        [self.wv loadHTMLString: @"" baseURL: nil];
    }
}

Ответ 2

Крик всем разработчикам: реализация didReceiveMemoryWarning является абсолютной необходимостью при использовании UIWebView!

И это особенно важно, когда UIWebView может перемещаться в любом месте или на страницу, которую вы знаете, что приводит к тому, что UIWebView имеет огромные утечки, такие как m.youtube.com.

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

В вашем представлении контроллер, переопределить didReceiveMemoryWarning, как это:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    [myWebView reload];
}

Ответ 3

С iOS 8 и далее вам действительно повезло. WKWebView не течет и имеет гораздо меньший объем памяти, чем UIWebView. Протестировав его с загруженными изображениями веб-страницами, содержащими сложный Javascript, он показал себя хорошо.

Ссылка на класс Apple WKWebView

nshipster в WKWebView

Это не идеально. И снова, надеюсь, несовершенства будут устранены вовремя. Ознакомьтесь с советами Shingo Fukuyama на GitHub:

WKWebViewTips

Ответ 4

  • В блоках ослабьте "я".

Это была одна из важных причин, которые привели к удержанию памяти WebView, даже когда вытащил стек навигации.