2010-09-10 22 views
8

Cada vez que carga una página nueva con UIWebView, la página cargada anteriormente se muestra durante un breve período de tiempo.Cómo eliminar la memoria caché de UIWebview o dealloc UIWebview

¿Cómo puedo borrar ese caché? Otra posibilidad sería dealloc UIWebview. Lo intenté pero mi UIWebView siempre está "vacío". ¿Cómo se deben hacer alloc y dealloc en este caso?

Me di cuenta de que el UIWebView consume aproximadamente 10 MB de RAM. Ahora el UIWebView se carga junto con el ViewController. Y la vista se libera automáticamente y se libera automáticamente el UIWebView. ¿No sería mejor tratar el WebView cada vez?

Solución:

- (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; 
} 

Respuesta

10

Mi solución a este problema fue la creación de la UIWebView mediante programación en viewWillAppear: y para liberarlo en viewDidDisappear:, así:

- (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 usted hace esto y su UIWebView no se libera, debe verificar su retención y comprender quién lo conserva.

+0

¿Qué es exampleFrame, webViewBed y exampleView? ¿Qué está autorizando Mask? No implemento el protocolo 'UIWebViewDelegate', así que no necesito el delegado. 'addSubview' no funciona para mí, porque mi' UIViewController' no es compatible con esto. Por lo que puedo ver, no estás liberando la vista web en 'viewDidDisappear'. Solo lo elimina de la supervista y lo establece en 'nil'. Probé tu enfoque y solo puedo ver una pantalla blanca. Edité mi pregunta para que puedas ver mi código. – testing

+0

exampleFrame es solo el tamaño de UIWebView que está creando. webViewBed no debe formar parte de este ejemplo, no es útil en este contexto. exampleView es la vista a la que está agregando UIWebView. Y, por supuesto, agregaSubview() a Vistas, no para ver controladores. Entonces tendrá que hacer algo como [viewController.view addSubview: ...]. Estoy publicando la vista web, es una propiedad (vea el "sí mismo") para que pueda establecerla en cero y se lance. – mips

+0

¡Perfecto! ¡Esta es la única solución en Internet que he encontrado que funcionaba! – Ravikant

2

Si tuviera que hacer una estimación de su propiedad para la web View es

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

correcta? La parte importante es retener.

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

El código anterior asigna un (retainCount significa = 1) UIWebView y después lo añade a self.webView, donde es retenido de nuevo (retainCount = 2).

Cambie el código a lo siguiente, y su vista web debe ser desasignado.

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

addSubview: sólo puede ser llamado en UIViews.

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

debería ser

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

Tienes razón. Pero no entiendo por qué el recuento de retención de 2 hace que la vista web muestre una pantalla blanca. Gracias por tu ayuda. ¿A quién debería darle la marca de verificación? Es difícil ... – testing

+0

No sé qué ni si la pantalla en blanco tiene algo que ver con este problema. Pero si le quedan problemas de administración de memoria, es complicado depurar otros problemas. Así que primero arregle la administración de la memoria e investigue más a fondo el problema de la pantalla blanca. –

27

que tenía casi el mismo problema. Quería borrar el caché de la vista web porque cada vez que recargo una página web local en un UIWebView, se muestra la anterior. Así que encontré una solución simplemente configurando la propiedad cachePolicy de la solicitud. Use un NSMutableURLRequest para establecer esta propiedad. Con todo, todo funciona bien con la recarga del UIWebView.

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

Hope that helps!

+0

¡esto resolvió mi problema! gracias – jithinroy

+2

esto no resolvió mi problema por la razón que sea. Supongo que es un error en la API. – markshiz

+0

Gracias: "removeAllCachedResponses" no funcionó para mí, pero esto fue así. – user621267

2

Hice algo más simple, simplemente configuré alpha de webView en 0 en loadRequest y 1 en webViewDidFinishLoad.

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

y

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

(En realidad tengo un fundido de entrada, como por ejemplo salir haciendo un PDF puede tomar 1/5 segundos más o menos.)

+2

Al establecer el valor alfa, se elimina la caché? Eso debe estar mal. –

4

Si desea eliminar todas las respuestas en caché, es posible que también desee probar algo como esto:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
0

también puede cargar @ "about: blank" después de la vista web desaparece, entonces estará vacío la próxima vez que acceda a él.