2010-08-27 10 views
10

Ho un problema con UIWebViews, ho visto la stessa domanda qui ma non c'era una risposta utile. la domanda è qui: UIWebView memory management. Lo citerò:Uiwebview e perdita di memoria enorme

Sto sviluppando un'applicazione che fa un uso pesante di UIWebView. Questa app genera dinamicamente molte UIWebViews durante il caricamento dei contenuti dal mio server. Alcune di queste UIWebView sono piuttosto grandi e hanno molte immagini.

Se utilizzo strumenti per rilevare perdite, non ne rilevo. Tuttavia, molti oggetti sono allocati e ho il sospetto che abbia a che fare con UIWebViews.

Quando la versione di Webview viene rilasciata perché non è più necessaria, sembra che non tutta la memoria sia stata rilasciata. Voglio dire, dopo una richiesta al mio server l'app crea un UITableView e molte webviews (gli strumenti dicono circa 8Mb). Quando l'utente tocca, tutti vengono rilasciati, ma l'utilizzo della memoria diminuisce solo di circa 2-3 Mb e dopo 5-10 minuti l'app si arresta in modo anomalo.

Ho creato un'app di prova semplice e ottengo gli stessi risultati.

E 'un tableView, Sto creando DetailsView in questo modo:

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

in DetailsVC Ho un WebView creata in IB. Mi carico html come questo:

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]; 

faccio anche:

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

Questo è tutto, ogni volta che scelgo qualsiasi WebView in RootViewController sto perdendo 2-3 Mb di memoria, C'è una soluzione a questo problema?

Grazie.

+0

sembra un problema molto vecchio e ben noto, la gente ci si imbatte dal 2008 e ancora nessuna soluzione ((((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, Ho trovato un'idea su come aggirare questo problema, è descritto qui: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html. Non è una soluzione a un problema, ma un qualche tipo di hack. Non posso credere che sia l'unico modo per farlo, qualsiasi altro pensiero? Grazie – Burjua

+0

possibile duplicato di [UIWebView perde memoria?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

risposta

0

Immagino che dal momento che si imposta webview = nil, si perde ogni possibilità di rilasciarlo.

+0

ho provato con esso e senza di esso, in realtà non importa, è stato rilasciato, ma non solo è liberata parte della memoria – Burjua

+1

L'impostazione di una proprietà retain su nil rilascia anche il valore precedente. –

3

Basta controllare il seguente 1. È la u effettua il WebView come proprietà rimuoverlo 2. E mettere il seguente codice nel didFinishLaunchingWithOptions in Appdelegate

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

Penso allora ur problema è risolto

+0

Ok, grazie, lo proverò – Burjua

+1

No, sfortunatamente questo non aiuta: (( – Burjua

0

So che questo thread è un po 'vecchio ma solo per un'idea e per aggiungere alcuni bit più rilevanti vorrei aggiungere questi suggerimenti in modo che i futuri visitatori possano dare un'occhiata a questo e il problema potrebbe essere risolto.

  • Si dovrebbe set Cache policy al vostro NSURLRequest oggetto e verificare la presenza di politiche che ignorano dati cache, vedere documentation.

  • Dal momento che si dispone di una chiamata al release nel codice suppongo si utilizza ARC, quindi perché non si chiama [super dealloc] in viewDidUnload()?

  • Dai un'occhiata a questo thread per informazioni su come cleanForDealloc utilizzando UIWebView.

  • È un UITableViewController? con una cella personalizzata? Prova a deallocare (rilasciare, removeFromSuperView, imposta su zero) anche loro.

Spero che sia d'aiuto!