2010-09-10 2 views
8

Chaque fois que je charge une nouvelle page avec UIWebView la page avant chargée est affichée pendant une courte période.Comment supprimer le cache de UIWebview ou dealloc UIWebview

Comment puis-je effacer ce cache? Une autre possibilité serait de traiter UIWebview. J'ai essayé cela mais mon UIWebView est toujours "vide". Comment faire le alloc et dealloc dans ce cas? J'ai remarqué que le UIWebView consomme environ 10 Mo de mémoire vive. Maintenant, le UIWebView est chargé avec le ViewController. Et la vue est autoreleased ainsi que le UIWebView est autoeleased. Ne vaudrait-il pas mieux libérer le WebView à chaque fois?

Solution:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    CGRect frame = CGRectMake(0, 0, 320, 480); 
    self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease]; 
    self.webView.scalesPageToFit = YES; 
    [self.view addSubview:self.webView]; 
} 

- (void) viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [self.webView removeFromSuperview]; 
    self.webView = nil; 
} 

Répondre

10

Ma solution à ce problème était de créer le UIWebView programme sur viewWillAppear: et de libérer sur viewDidDisappear:, comme ceci:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    self.webView = [[[UIWebView alloc]initWithFrame:exampleFrame] autorelease]; 
    self.webView.scalesPageToFit = YES; 
    self.webView.delegate = self; 
    self.webView.autoresizingMask = webViewBed.autoresizingMask; 
    [exampleView addSubview:self.webView]; 
} 
- (void) viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [self.webView removeFromSuperview]; 
    self.webView.delegate = nil; 
    self.webView = nil; 
} 

Si vous faites cela et votre UIWebView ne se libère pas, vous devriez vérifier qu'il s'agit du nombre de retenues et comprendre qui le retient.

+0

Qu'est-ce qu'exempleFrame, webViewBed et exampleView? Qu'est-ce que autoresizingMask? Je n'implémente pas le protocole 'UIWebViewDelegate' donc je n'ai pas besoin du délégué. 'addSubview' ne fonctionne pas pour moi, car' UIViewController' ne le supporte pas. Autant que je puisse voir, vous ne libérez pas la vue web sur 'viewDidDisappear'. Vous ne le supprimez que de la vue d'ensemble et la définissez sur "nil". J'ai essayé votre approche et je ne peux voir qu'un écran blanc. J'ai édité ma question pour que vous puissiez voir mon code. – testing

+0

exampleFrame est juste la taille de l'UIWebView que vous créez. webViewBed ne devrait pas faire partie de cet exemple, il n'est pas utile dans ce contexte. exampleView est l'affichage auquel vous ajoutez UIWebView. Et bien sûr, vous ajoutez Ads() à Views, pas pour voir les contrôleurs. Vous devrez donc faire quelque chose comme [viewController.view addSubview: ...]. Je publie le webview, c'est une propriété (voir le "self."?) Ainsi vous pouvez le mettre à zéro et il sera libéré. – mips

+0

Parfait !! C'est la seule solution sur Internet que j'ai trouvé à travailler !! – Ravikant

2

Si je devais faire une supposition votre propriété pour webView est

@property (nonatomic, retain) IBOutlet UIWebView *webView; 

correcte? La partie importante est la retenue.

self.webView = [[UIWebView alloc]initWithFrame:frame]; 

Le code ci-dessus alloue un UIWebView (ce qui signifie retainCount = 1), puis ajoute à self.webView, où il est retenu à nouveau (retainCount = 2).

Remplacez le code par le suivant et votre site Web doit être désalloué.

self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease]; 

addSubview: ne peut être appelé UIViews.

//[self.navigationController addSubview:self.webView]; 

devrait être

[self.navigationController.view addSubview:self.webView]; 
+0

Vous avez raison. Mais je ne comprends pas pourquoi le nombre de retenue de 2 provoque l'affichage Web d'un écran blanc. Merci de votre aide. Qui dois-je donner la coche? C'est difficile ... – testing

+0

Je ne sais pas quoi ou même si l'écran blanc a quelque chose à voir avec ce problème. Mais si vous avez des problèmes de gestion de la mémoire, il est compliqué de déboguer d'autres problèmes. Donc, d'abord réparer la gestion de la mémoire et étudier plus en profondeur dans le problème de l'écran blanc. –

27

J'ai eu à peu près le même problème. Je voulais que le cache webview soit effacé, car chaque fois que je recharge une page web locale dans un UIWebView, l'ancien est affiché. J'ai donc trouvé une solution en définissant simplement la propriété cachePolicy de la requête. Utilisez un NSMutableURLRequest pour définir cette propriété. Avec tout ce que tout fonctionne très bien avec recharger le UIWebView.

NSURL *url = [NSURL fileURLWithPath:MyHTMLFilePath]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[self.webView loadRequest:request]; 

Hope that helps!

+0

cela a résolu mon problème! merci – jithinroy

+2

cela n'a pas résolu mon problème pour une raison quelconque. Je suppose que c'est un bug dans l'API. – markshiz

+0

Merci: "removeAllCachedResponses" n'a pas fonctionné pour moi mais cela a fonctionné. – user621267

2

J'ai fait quelque chose de plus simple, je viens de mettre alpha de webView à 0 sur loadRequest et 1 sur webViewDidFinishLoad.

thewebview.alpha=0.0; 
thewebview.backgroundColor=[UIColor whiteColor]; 
[thewebview loadRequest:[NSURLRequest requestWithURL:url(str)]]; 

et

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    thewebview.alpha=1.0; 
} 

(En fait, j'ai un fade-in, comme le rendu f.ex. un fichier PDF peut prendre 1/5 secondes.)

+2

La définition de la valeur alpha supprime le cache? Cela doit être faux. –

4

Si vous voulez supprimer toutes les réponses mises en cache, vous pouvez également essayer quelque chose comme ceci:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
0

vous pouvez également charger @ « about: blank » après la disparition WebView, alors il sera vide la prochaine fois que vous y accéderez.