Утечка памяти с UIWebView

Мой проект представляет собой гибридную статическую библиотеку для отображения UIWebView с некоторыми JS для управления логикой. Когда я использую 64-битную версию и запускаю демонстрацию на iOS 8 /iPhone 6, объем памяти продолжает увеличиваться до 30 МБ и более!

  1. Когда я использую генерацию в инструменте, увеличение использования памяти почти полностью связано с веб-ядром; это означает, что в коде JS есть утечки? Я не могу найти утечку, когда использую Safari для запуска аналогичного JS напрямую.

  2. Когда я выпускаю UIWebView, память все еще не освобождается; Я проверил с распределением инструментов. В памяти все еще есть веб-ядро и (не объект), что я могу сделать, чтобы освободить их?

    • 0JavaScriptCore WTF :: MallocHook :: recordAllocation (void *, unsigned long)
    • 1 JavaScriptCore WTF :: fastMalloc (без знака long)
    • 2 WebCore WebCore :: SharedBuffer :: buffer () const
    • 3 WebCore WebCore :: SharedBuffer :: data () const
    • 4 WebCore WebCore :: ResourceLoader :: didReceiveDataOrBuffer (char const *, unsigned int, WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 5 WebCore WebCore :: SubresourceLoader :: didReceiveDataOrBuffer (char const *, int, WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 6 WebCore WebCore :: SubresourceLoader :: didReceiveBuffer (WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 7 WebCore WebCore :: ResourceLoader :: didReceiveBuffer (WebCore :: ResourceHandle *, WTF :: PassRefPtr, int)
    • 8 WebCore WebCore :: SynchronousResourceHandleCFURLConnectionDelegate :: didReceiveDataArray (__ CFArray const *)

Я использую следующий код.

-(void)createUIWebview{
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:serviceUrl]]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
}

-(void)dealloc{
if (_webView.isLoading){
    [_webView stopLoading];
}
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
_webView.delegate=nil;
[_webView removeFromSuperview];
[_webView release];
_webView = nil;
}

Я исследовал следующие ссылки, но, похоже, они не решают мою проблему. UIWebview все еще протекает в iOS 8? И проблема, кажется, не так очевидна, когда я использую iOS 6 в iPhone4.

Как правильно выпускать UIWebView?

Управление памятью в iOS 8 UIWebView

Утечки UIWebView, JS Garbage Collector & Виртуальные машины WebCore

Освободить память /cookie /кэш из UIWebView после закрытия

7 голосов | спросил shan li 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 04:47:27 +0300000000amMon, 09 Feb 2015 04:47:27 +030015 2015, 04:47:27

2 ответа


0

У меня возникла та же проблема, и я переключился на новый WKWebView, и он сразу решил все проблемы с утечкой памяти, которые я видел. WKWebView использует много одинаковых имен вызовов из UIWebView так что все, что мне нужно было сделать в моем проекте, это переключить все мои объекты UIWebView на WKWebView, и утечки памяти исчезли.

Не забудьте импортировать WebKit в свой проект и знать, что он доступен только для iOS8.

Документация Apple

ответил Chase S 13 FebruaryEurope/MoscowbFri, 13 Feb 2015 22:38:24 +0300000000pmFri, 13 Feb 2015 22:38:24 +030015 2015, 22:38:24
0

У меня была похожая проблема: пользователи тестировали приложение, просматривая изображения в UIWebView. Приложение будет зависать после N превью. Использование инструмента Apple Instruments с шаблоном профилирования Allocations. Из этого инструмента мне удалось выбрать следующую продолжительность жизни размещения: «Создано и постоянно». Дальнейшие наблюдения заключаются в том, что при предварительном просмотре одного и того же файла несколько раз, постоянные байты (на основе определения apple, это количество байтов, которые были выделены, но не освобождены.) Для ImageIO_jpeg_Data продолжают расти в два раза, это верно для любого другого типа изображения .

Для этого нужно использовать UIImageView от Apple в качестве отдельного средства предварительного просмотра изображений, это не вызывает никаких утечек памяти при предварительном просмотре изображений.

ответил Ahmed Ebaid 4 J0000006Europe/Moscow 2015, 22:32:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132