2010-08-27 29 views
10

Tengo un problema al usar UIWebViews, he visto la misma pregunta aquí pero no hubo una respuesta útil. la pregunta está aquí: UIWebView memory management. Lo citaré:uiwebview y pérdida de memoria enorme

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.

He creado la aplicación de prueba simple y tengo los mismos resultados.

Es un tableView, estoy creando DetailsView así:

DetailsVC *detailViewController = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil]; 
detailViewController.n = indexPath.row; 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 

en DetailsVC que tienen una web View creada en IB. Me carga html así:

NSString *urlAddress; 
if (self.n == 0) 
{ 
    urlAddress = @"http://www.google.com"; 
} 
else 
{ 
    urlAddress = @"http://www.yahoo.com"; 
} 

NSURL *url = [NSURL URLWithString:urlAddress]; 

NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

[self.webView loadRequest:requestObj]; 

También hago:

- (void)viewDidUnload { 
self.webView = nil; 
} 

Eso es, cada vez que elegir cualquier web View en RootViewController estoy perdiendo 2-3 Mb de memoria, ¿Hay una solución a este problema?

Gracias.

+0

parece un problema muy viejo y bien conocido, las personas se están encontrando con él desde 2008 y todavía no hay solución ((((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, Encontré una idea sobre cómo solucionar este problema, que se describe aquí: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html. No es una solución a un problema, sino una especie de truco. No puedo creer que sea la única forma de hacerlo, ¿no es así? Gracias – Burjua

+0

posible duplicado de [¿UIWebView pierde memoria?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

Respuesta

0

Supongo que desde que configura webview = nil, pierde cualquier posibilidad de liberarlo.

+0

intenté con él y sin él, en realidad no importa, se está liberando, pero no solo se libera parte de la memoria – Burjua

+1

Establecer una propiedad retener a cero también libera el valor anterior. –

3

simplemente marque la siguiente 1. ¿u hacer la vista web como propiedad quitarlo 2. Y puso el siguiente código en didFinishLaunchingWithOptions en Appdelegate

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
    [sharedCache release]; 

Creo entonces ur problema se resuelve

+0

Ok, gracias, lo intentaré – Burjua

+1

No, desafortunadamente esto no ayuda: (( – Burjua

0

Sé que este hilo es un poco viejo, pero solo por una idea y para agregar algunas piezas más relevantes, me gustaría agregar estos consejos para que los futuros visitantes puedan ver esto también y que el problema se solucione.

  • Usted debe set Cache policy a su objeto NSURLRequest y comprobar si hay políticas que ignoran datos de la caché, consulte la documentation.

  • Puesto que usted tiene una llamada a release en su código que supongo que está utilizando ARC, ¿por qué no llamas [super dealloc] en viewDidUnload()?

  • Echa un vistazo a este hilo para saber cómo cleanForDealloc usando UIWebView.

  • ¿Es un UITableViewController? con una celda personalizada? Trate también de desasignar (liberar, quitar de SuperSuperView, configurarlo).

Espero que ayude!