2010-06-01 16 views
18

Tengo un problema con la administración de la memoria.Administración de memoria UIWebView

Estoy desarrollando una aplicación que hace un uso intensivo de UIWebView. Esta aplicación genera dinámicamente muchas UIWebViews mientras carga contenido desde mi servidor. Algunas de estas UIWebViews son bastante grandes y tienen muchas imágenes.

Si uso instrumentos para detectar fugas, no los detecto. Sin embargo, se asignan muchos objetos y sospecho que tiene que ver con UIWebViews.

Cuando la webviews se libera porque ya no es necesaria, parece que no se ha liberado la totalidad de la memoria. Quiero decir, después de una solicitud a mi servidor, la aplicación crea una UITableView y muchas vistas web (los instrumentos dicen que son aproximadamente 8Mb). Cuando el usuario vuelve a presionar, todos se liberan, pero el uso de la memoria solo disminuye alrededor de 2 a 3 Mb, y después de 5 a 10 minutos con la aplicación se bloquea.

¿Echo de menos algo? ¿Alguien sabe lo que podría estar pasando?

¡Gracias!

+0

¿Puede usted por favor, eche un vistazo a mi solución aquí: http://stackoverflow.com/questions/3582908/uiwebview-and-huge-memory-loss/ 21250327 # 21250327 – NeverHopeless

Respuesta

0

Si agrega varias subvistas dentro de la misma instancia de un controlador de vista, debe eliminar la subvista anterior de la supervista antes de agregar una nueva subvista.

Añadir una etiqueta a la UIWebView antes de añadirlo como una subvista:

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

webView = nil; 

Antes de agregar la nueva vista web (esto borrará el viejo punto de vista), quite la vista secundaria de la supervista:

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

Si no elimina las vistas web anteriores de la supervista, se acumularán en la memoria hasta que suelte el control de vista.

5

Trate de añadir

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

justo antes de soltar el WebView. Para una fuga en 4.2.1 relacionada con la visualización de un PDF en un UIWebView esto resuelve la mayoría de los problemas de fugas para mí.

+0

enfrentando el mismo problema al usar más imágenes en la vista web. Cómo solucionar esto en el arco –

7

Esto no es una solución, pero es una posible explicación de los problemas que enfrenta.

Tuve problemas de memoria con una aplicación en la que trabajé. Consistió en (en efecto) una vista de desplazamiento, que contiene 3 vistas web de pantalla completa. El tamaño del contenido de cada vista web era de varias pantallas, digamos 10 en promedio.

Cuando carga una vista web, toda la vista se procesa en la memoria. ASIMISMO, aparte de la memoria utilizada para cargar las imágenes y otros datos (las cosas que se ven en el instrumento Allocations), la vista web en sí utiliza memoria cuando se procesa sobre la que no tiene control.

Así, por ejemplo, una vista web 768x1024, con 10 páginas de contenido usaría

768 * 1024 * 10 (páginas) * 4 (bits por píxel) = 31457280 = 30 MB.

Multiplicar por 3 vistas web, y eso es 90MB utilizado en la parte superior de la memoria que la aplicación asignó directamente.

Puede obtener una idea de la cantidad de memoria que se está utilizando así en Instruments, utilizando el VM Tracker instrumento.

+0

Aquí hay un buen enfoque: http://stackoverflow.com/questions/10163879/ways-to-improve-uiwebview-scrolling-performance – CarlJ

1

escribir esto en su viewWillDisappear método:

[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
+3

Bajé la votación porque esto no proporciona ninguna explicación. Puede ser correcto, puede que no lo sea, pero sin ninguna explicación, no hay forma de que deberías confiar en la respuesta. –

+0

@RoyLeban siento su culpa por mi parte me disculpo y ahora agregué la descripción gracias :) –

+1

Estoy bajando esta votación porque si una página web muestra un video en iPhone, lo hace al mostrar un reproductor de video a pantalla completa. Esto desencadena el método willDisappear, elimina la página web actual de UIWebView y hace que el video deje de reproducirse al instante. – Ash

Cuestiones relacionadas