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

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

У меня проблема с управлением памятью.

Я разрабатываю приложение, которое сильно использует UIWebView. Это приложение создает динамически много UIWebViews при загрузке содержимого с моего сервера. Некоторые из этих UIWebViews довольно большие и имеют много фотографий.

Если я использую инструменты для обнаружения утечек, я их не обнаруживаю. Однако выделено много объектов, и я подозреваю, что это связано с UIWebViews.

Когда релиз webviews больше не нужен, кажется, что не вся память освобождена. Я имею в виду, что после запроса на мой сервер приложение создает UITableView и многие веб-просмотры (инструменты говорят о 8 Мб). Когда пользователь отбрасывает назад, все они освобождаются, но использование памяти уменьшается только на 2-3 Мбайта, а через 5-10 минут с помощью приложения происходит сбой.

Я что-то упустил? Кто-нибудь знает, что может произойти?

Спасибо!

4b9b3361

Ответ 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];

Если вы не удалите старые веб-просмотры из супервизора, они будут накапливаться в памяти до тех пор, пока вы не освободите диспетчер представлений.