UIWebView управление памятью - PullRequest
18 голосов
/ 01 июня 2010

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

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

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

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

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

Спасибо!

Ответы [ 4 ]

7 голосов
/ 01 июня 2012

Это не решение, а возможное объяснение проблем, с которыми вы сталкиваетесь.

У меня были проблемы с памятью в приложении, над которым я работал. Он состоял из (по сути) представления с прокруткой, содержащего 3 полноэкранных веб-представления. Размер контента каждого веб-просмотра составлял несколько экранов, скажем, в среднем 10.

При загрузке веб-просмотра весь вид отображается в памяти. Итак, кроме памяти, используемой для загрузки изображений и других данных (материал, который вы видите в инструменте Allocations ), само веб-представление использует память, когда оно отображается, что вы не можете контролировать его.

Так, например, для веб-просмотра 768x1024 с 10 страницами контента будет использоваться

768 *1024* 10 (страницы) * 4 (бит на пиксель) = 31 457 280 = 30 МБ.

Умножьте на 3 просмотра веб-страниц, и это 90 МБ используется поверх памяти, которую приложение выделило напрямую.

Вы можете почувствовать, сколько памяти используется таким образом в Инструментах, используя инструмент VM Tracker .

5 голосов
/ 15 апреля 2011

Попробуйте добавить

[webView loadHTMLString: @"" baseURL: nil];

прямо перед выпуском веб-просмотра. Для утечки в 4.2.1, связанной с отображением PDF в UIWebView, это решает большинство проблем утечки для меня.

1 голос
/ 03 июля 2012

Напишите это в вашем viewWillDisappear методе:

[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
0 голосов
/ 17 июля 2010

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

Добавьте тег в UIWebView, прежде чем добавить его в качестве подпредставления:

webView.tag  = 10;
[self.view addSubview:webView];

webView = nil;

Перед добавлением нового веб-просмотра (это очистит старый вид), удалите подпредставление из суперпредставления:

UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10];
[oldWebView removeFromSuperview];

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

...