2010-12-13 41 views
1

Je lis des vidéos YouTube sur un UIWebView qui apparaît sous la forme d'une sous-vue modalViewController (transition flip). Tout fonctionne bien, même si l'UIWebView est sorti, je reçois toujours des avertissements de mémoire après quelques sélections répétées de ce modalViewController. J'ai ajouté mon UIWebView par programmation dans ViewDidLoad. A l'intérieur viewDidDisappear Je vérifie pour [UIWebView retainCount] et si elle est supérieure à 1, procédez comme suit:Problèmes de mémoire UIWebView

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
[self.webView removeFromSuperview]; 
self.webView.delegate = nil; 
self.webView = nil; 

NSLog(@"[self.webView retainCount] %d", [self.webView retainCount]); 

Je courais mon code sur Xcode 3.2.5, iOS 4.2.

Appréciez tout ce que vous aidez.

Répondre

5

Je pense que vous abordez le problème de gestion de la mémoire dans le mauvais sens. La vérification de retainCount est une technique de débogage valide si vous savez ce que vous faites. Ce n'est cependant pas un outil de gestion de la mémoire. Dans votre cas particulier, si UIWebView est affiché, il aura toujours un nombre de retenue supérieur à 1. Le superview aura une retenue, rendant ainsi le "si" inutile.

Si la propriété webView est bien définie (à savoir noatomic, conserver) la déclaration:

self.webView = nil; 

devrait libérer WebView. Une erreur commune est d'initialiser la propriété avec:

self.webView = [[UIWebView alloc] init]; 

Ceci est susceptible d'introduire une fuite si la webView est définie comme « conserver ». La manière correcte est

self.webView = [[[UIWebView alloc] init] autorelease]; 

Si vous ne pouvez pas afficher votre contrôleur plusieurs fois sans manquer de mémoire, vous avez une fuite de mémoire. Utilisez des instruments (des fuites en particulier) pour trouver les objets qui sont relâchés correctement. This is a good tutorial.

Soyez prudent en gardant vos retenues et les communiqués équilibrés et vérifier les fuites.

+0

Merci pour votre réponse. En fait, j'ai initialisé webview comme suit: self.webView = [[[UIWebView alloc] initWithFrame: CGRectZero] autorelease]; Grâce à Instruments, je suis incapable de détecter toute fuite sur vue rejet. Mais le contrôle atteint la méthode didReceiveMemoryWarning avec un avertissement de niveau 1 et l'application se bloque. – random

+0

@techenthusiast Avez-vous trouvé la solution? Cela vous sera très utile si vous postez la solution !!! Même avertissement répété et s'est écrasé dans mycase suis en utilisant quatre webviews chargeant des images –