UIWebView não liberando todos os bytes ativos usando o ARC
Atualmente, estou construindo um aplicativo de controlador de navegação no iOS 5.1 que usa o ARC. Muitas vezes preciso exibir páginas da Web e criei um visualizador da Web que é apenas um UIWebView com algum conteúdo personalizado ao redor dos lados. Quando o usuário tiver terminado de olhar a página, ele acessa o botão Voltar, que deve liberar toda a memória associada ao visualizador da Web personalizado. Meu problema é que toda a memória não parece ser liberada quando o botão Voltar é atingido. Eu construí um aplicativo de brinquedo (no github) é apenas um par de botões, cada um com uma resposta inicial que chama uma página diferente.
<code>@implementation ViewController -(IBAction)googlePressed:(id)sender { CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.google.com"]; [self.navigationController pushViewController:customWebView animated:NO]; } -(IBAction)ksbwPressed:(id)sender { CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.ksbw.com/news/money/Yahoo-laying-off-2-000-workers-in-latest-purge/-/1850/10207484/-/oeyufvz/-/index.html"]; [self.navigationController pushViewController:customWebView animated:NO]; } -(IBAction)feedProxyPressed:(id)sender { CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://feedproxy.google.com/~r/spaceheadlines/~3/kbL0jv9rbsg/15159-dallas-tornadoes-satellite-image.html"]; [self.navigationController pushViewController:customWebView animated:NO]; } -(IBAction)cnnPressed:(id)sender { CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.cnn.com/2012/04/04/us/california-shooting/index.html?eref=rss_mostpopular"]; [self.navigationController pushViewController:customWebView animated:NO]; } </code>
O CustomWebView é apenas um UIWebView vinculado na propriedade IB to UIWebView
<code>@implementation CustomWebView @synthesize webView, link; - (id)initWithStringURL:(NSString *) stringURL { if (self = [super init]) { link = stringURL; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:link]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; [webView loadRequest:urlRequest]; } - (void)viewDidUnload { [super viewDidUnload]; } </code>
Meu problema é que eu configurei a linha de base do heap para ser o ViewController inicial assim que tudo estiver carregado. Eu então verifico o heap depois de carregar uma página e depois retornar ao ViewController e obter os seguintes heapshots:
O que mostra que após cada série de clicar em um botão e retornar ao ViewController, o heap continua a crescer, mesmo que o CustomWebView deva ser liberado.
EDITAR:
O projeto de amostra descrito acima pode ser encontradono github