UIWebView no está desasignando memoria
Tengo problemas reales para intentar recuperar la memoria que he asignado para unUIWebView
dentro de mi aplicación Básicamente creo y presento elUIWebView
temporalmente para el usuario en un separadoViewController
, luego elimine todas las referencias y haga estallarViewController
de la pila A pesar de hacer todo esto, la memoria asignada nunca se devuelve, y me quedo atascado con 10 Mb adicionales de memoriacada vez Yo sigo a esoViewController
de nuevo.
Veamos cómo estoy manejando estoUIWebView
de todos modos
Bueno, para empezar, tengo una referencia local en mi archivo de encabezado, mostrar aquí
#pragma mark UIWebView Properties
/// WebView for loading URL resources
@property (nonatomic, weak)UIWebView *webView;
Tenga en cuenta que no es unIBOutlet
Estoy creando estoUIWebView
programáticamente en el siguiente método, disparado enViewDidAppear
.
-(void)presentYoutubeVideoWithID:(NSString *)videoID {
/* Setup UIWebView */
UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
/* Set Delegate */
[webView setDelegate:self];
/* Set local property */
[self setWebView:webView];
/* Add view to ViewController */
[self.view addSubview:webView];
/* Set constraints */
// Removed for simplicity
/* Set URL */
NSString *youTubeVideoHTML = @"<!DOCTYPE html> (Removed) </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.view.frame.size.width, self.view.frame.size.height, videoID];
[webView loadHTMLString:html baseURL:[[NSBundle mainBundle]resourceURL]];
/* Setup Notification */
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWhenDoneButtonClick:)
name:UIWindowDidBecomeHiddenNotification
object:nil];
}
Y finalmente, limpio y "reviento" elUIViewController
:
-(void)handleWhenDoneButtonClick:(NSNotification *)notification {
/* Remove Observer */
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIWindowDidBecomeHiddenNotification object:self.view.window];
/* Remove UIWebView from hierarchy */
[self.webView removeFromSuperview];
/* Remove self from webView delegate */
[self.webView setDelegate:nil];
/* Remove reference because I can */
[self setWebView:nil];
/* Dismiss ViewController */
[self dismissViewControllerAnimated:YES completion:nil];
}
Para un escenario bastante simple, nada parece eliminar realmente la memoria ocupada por UIWebView. Como puede ver aquí, el uso de memoria nunca disminuye:
Antes de cargar UIWebView:
Una vez que el UIWebView está abierto:
Después de abrir el ViewController y eliminar las referencias a UIWebView:
La cantidad de memoria utilizada aquí persiste indefinidamente por lo que puedo decir. Después de cinco minutos, todavía tendrá más de 34 Mb asignados. Si abro elViewController
nuevamente, asignará más, y terminaré con unos 40 Mb de uso "base" una vez que vuelva a aparecer.
Fugas: No estando completamente disuadido, inicialmente fui a buscar fugas, pensando que había cometido algún error en alguna parte. Sin embargo, aunque en realidad encontré algunos muypequeña fugas, aparentemente estaban completamente relacionadas conUIWebView
.
Otros casos sobre S.O: He estado buscando bastante tiempo una solución para esto en la web, pero el único hilo realmente relevante que he encontrado es uno del año pasado como se ve aquí:UIWebView toma mucha memoria
Todavía no tiene una respuesta, y eso probablemente se deba a que (como la mayoría de las otras preguntas relacionadas con este tema), muchas de las respuestas brindan consejos genéricos / conflictivos. como sugerirle que use ARC (¿Quién no?) o informarle a OP que no deben mantener referencias fuertes (incluso cuando no lo están, y el código lo demuestra). Finalmente, algunas respuestas solo afirman que la administración de memoria no es un problema para empezar porque hay suficiente para todos, y esas tampoco son respuestas útiles.
De todos modos, este es el problema actual que estoy enfrentando. Gracias por tomarse el tiempo de leer esto (¡si lo hizo!).