Управление памятью UIWebView
У меня проблема с управлением памятью.
Я разрабатываю приложение, которое сильно использует UIWebView. Это приложение создает динамически много UIWebViews при загрузке содержимого с моего сервера. Некоторые из этих UIWebViews довольно большие и имеют много фотографий.
Если я использую инструменты для обнаружения утечек, я их не обнаруживаю. Однако выделено много объектов, и я подозреваю, что это связано с UIWebViews.
Когда релиз webviews больше не нужен, кажется, что не вся память освобождена. Я имею в виду, что после запроса на мой сервер приложение создает UITableView и многие веб-просмотры (инструменты говорят о 8 Мб). Когда пользователь отбрасывает назад, все они освобождаются, но использование памяти уменьшается только на 2-3 Мбайта, а через 5-10 минут с помощью приложения происходит сбой.
Я что-то упустил?
Кто-нибудь знает, что может произойти?
Спасибо!
Ответы
Ответ 1
Это не решение, а возможное объяснение проблем, с которыми вы сталкиваетесь.
У меня были проблемы с памятью с приложением, над которым я работал. Он состоял из (по сути) вида прокрутки, содержащего 3 полноразмерных веб-представления. Каждый размер содержимого веб-просмотра был несколько экранов, скажем, 10 в среднем.
При загрузке webview весь вид отображается в памяти. SO, помимо памяти, используемой для загрузки изображений и других данных (материал, который вы видите в инструменте Allocations), сам веб-просмотр использует память, когда она визуализируется, что вы не контролируете ее.
Итак, например, веб-просмотр 768x1024 с 10 страницами контента будет использовать
768 * 1024 * 10 (страницы) * 4 (бит на пиксель) = 31,457,280 = 30 МБ.
Умножьте на 3 веб-представления и 90 МБ, используемые в верхней части памяти, которые приложение назначено напрямую.
Вы можете понять, сколько памяти используется в этом приложении в Инструментах, используя инструмент VM Tracker.
Ответ 2
Попробуйте добавить
[webView loadHTMLString: @"" baseURL: nil];
прямо перед выпуском webview. Для утечки в 4.2.1, относящейся к отображению PDF в UIWebView, это решает большинство проблем с утечкой для меня.
Ответ 3
Запишите это в свой метод viewWillDisappear
:
[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
Ответ 4
Если вы добавляете несколько подзонов в один и тот же экземпляр диспетчера представлений, вы должны удалить старый подвью из супервизора, прежде чем добавлять новое подвью.
Добавьте тег в UIWebView, прежде чем добавлять его в качестве подзаголовка:
webView.tag = 10;
[self.view addSubview:webView];
webView = nil;
Перед тем, как добавить новый веб-просмотр (это очистит старое представление), удалите subview из супервизора:
UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10];
[oldWebView removeFromSuperview];
Если вы не удалите старые веб-просмотры из супервизора, они будут накапливаться в памяти до тех пор, пока вы не освободите диспетчер представлений.