iphone - open - Gestión de memoria UIWebView
uiwebview tutorial (4)
Tengo un problema con la gestión de la memoria.
Estoy desarrollando una aplicación que hace un uso intensivo de UIWebView. Esta aplicación genera dinámicamente un montón de UIWebViews al cargar contenido desde mi servidor. Algunos de estos UIWebViews son bastante grandes y tienen muchas fotos.
Si utilizo instrumentos para detectar fugas, no detecto ninguna. Sin embargo, se asignan muchos objetos y sospecho que tiene que ver con UIWebViews.
Cuando se publican las vistas web porque ya no son necesarias, parece que no se libera toda la memoria. Quiero decir, después de una solicitud a mi servidor, la aplicación crea un UITableView y muchas vistas web (los instrumentos dicen aproximadamente 8Mb). Cuando el usuario vuelve a tocar, todos se liberan, pero el uso de la memoria solo disminuye de 2 a 3 Mb, y luego de 5 a 10 minutos de uso de la aplicación se bloquea.
¿Me estoy perdiendo de algo? Alguien sabe que podría estar pasando?
¡Gracias!
Escribe esto en tu método viewWillDisappear
:
[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
Esto no es una solución, sino una posible explicación de los problemas a los que se enfrenta.
Tuve problemas de memoria con una aplicación en la que trabajé. Consistió en (en efecto) una vista de desplazamiento, que contenía 3 vistas web de tamaño de pantalla completa. El tamaño del contenido de cada webview era pantallas múltiples, digamos 10 en promedio.
Cuando carga una vista web, toda la vista se representa en la memoria. Por lo tanto, aparte de la memoria utilizada para cargar las imágenes y otros datos (lo que ve en el instrumento de Asignaciones ), la vista web usa memoria cuando se procesa sobre la cual no tiene control.
Así, por ejemplo, una vista web de 768x1024, con 10 páginas de contenido usaría
768 * 1024 * 10 (páginas) * 4 (bits por píxel) = 31,457,280 = 30MB.
Multiplique por 3 vistas web, y se utilizan 90 MB en la parte superior de la memoria que la aplicación asignó directamente.
Puede tener una idea de cuánta memoria se está utilizando de esta manera en los instrumentos, utilizando el instrumento VM Tracker .
Intenta agregar
[webView loadHTMLString: @"" baseURL: nil];
justo antes de lanzar la 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í.
Si agrega varias subvistas dentro de la misma instancia de un controlador de vista, debe eliminar la subvista anterior de la vista previa antes de agregar una subvista nueva.
Agregue una etiqueta a UIWebView antes de agregarla como una subvista:
webView.tag = 10;
[self.view addSubview:webView];
webView = nil;
Antes de agregar la nueva vista web (esto borrará la vista anterior), elimine la subvista de la vista de supervisión:
UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10];
[oldWebView removeFromSuperview];
Si no elimina las vistas web antiguas de la vista de supervisión, se acumularán en la memoria hasta que suelte el controlador de vista.