2010-08-27 8 views
10

J'ai un problème en utilisant UIWebViews, j'ai vu la même question ici mais il n'y avait pas de réponse utile. la question est ici: UIWebView memory management. Je vais le citer:uiwebview et énorme perte de mémoire

Je développe une application qui utilise intensément UIWebView. Cette application génère dynamiquement beaucoup de UIWebViews tout en chargeant le contenu de mon serveur. Certains de ces UIWebView sont assez volumineux et ont beaucoup d'images.

Si j'utilise des instruments pour détecter des fuites, je n'en détecte aucune. Cependant, beaucoup d'objets sont alloués et je suppose que cela a à voir avec les UIWebViews. Lorsque la version de la vue sur le Web n'est plus nécessaire, il semble que toute la mémoire n'est pas libérée. Je veux dire, après une demande à mon serveur l'application crée un UITableView et de nombreuses webviews (les instruments disent environ 8Mb). Lorsque l'utilisateur tape en arrière, tous sont libérés, mais l'utilisation de la mémoire ne diminue que de 2 à 3 Mb, et après 5 à 10 minutes, l'application se bloque.

J'ai créé une application de test simple et j'ai les mêmes résultats.

Il est un tableView, je crée DetailsView comme ceci:

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

dans DetailsVC J'ai un webView créé en IB. Je charge html comme ceci:

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

Je fais aussi:

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

Ca y est, chaque fois que je choisis toute webView dans RootViewController Je perdre 2-3 Mo de mémoire, est-il une solution à ce problème?

Merci.

+0

il semble que très vieux et bien connu problème, les gens s'y heurtent depuis 2008 et toujours pas de solution (((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, J'ai trouvé une idée pour contourner ce problème, elle est décrite ici: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html. pas une solution à un problème, mais une sorte de hack.Je ne peux pas croire que c'est la seule façon de le faire, d'autres pensées? Merci – Burjua

+0

duplication possible de [Est-ce que la mémoire de fuite UIWebView?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

Répondre

0

Je suppose que puisque vous définissez webview = nil, vous perdez toute chance de le libérer.

+0

J'ai essayé avec elle et sans elle, cela n'a pas d'importance, elle est libérée, mais pas seulement une partie de la mémoire est libérée – Burjua

+1

La définition d'une propriété retain à zéro libère également la valeur précédente. –

3

Il suffit de cocher la suivante 1. u faire la WebView comme propriété enlever 2. Et mettre le code suivant dans didFinishLaunchingWithOptions dans Appdelegate

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

Je pense alors ur problème est résolu

+0

Ok, merci, je vais l'essayer – Burjua

+1

Non, malheureusement, cela n'aide pas: (( – Burjua

0

Je sais que ce fil est un peu vieux mais juste pour une idée et pour ajouter quelques bits plus pertinents je voudrais ajouter ces bouts afin que les futurs visiteurs puissent y jeter un coup d'oeil et le problème pourrait être résolu.

  • Vous devez set Cache policy à votre objet NSURLRequest et vérifier les politiques qui ne tiennent pas compte données de cache, voir documentation.

  • Puisque vous avez un appel à release dans votre code je suppose que vous utilisez ARC, alors pourquoi n'appelez-vous pas [super dealloc] dans viewDidUnload()?

  • Jetez un oeil à ce fil pour savoir comment utiliser cleanForDealloc en utilisant UIWebView.

  • Est-ce un UITableViewController? avec des cellules personnalisées? Essayez de désallouer (release, removeFromSuperView, mettez à zéro) eux aussi.

Espérons que ça aide!

Questions connexes