Массивная утечка памяти в 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?
Ответы
Ответ 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, даже когда вытащил стек навигации.