Ecco alcuni comportamenti strani spero che qualcuno possa confermare è un bug noto o suggerire una soluzione alternativa.UIWebView che perde durante la visualizzazione di PDF di grandi dimensioni su iPad
La mia app per iPad deve visualizzare alcuni PDF di grandi dimensioni (~ 7mb e grafica pesante). Il percorso di minor resistenza è ovviamente un UIWebView, ma la mia app si arresta in modo anomalo dopo la visualizzazione di alcuni. Ho isolato il comportamento in un nuovo progetto e ho eseguito strumenti su di esso.
Ecco i risultati. Sembrano indicare che in UIWebView si stanno verificando cattive fughe di notizie.
Il codice essenziale, in un piccolo controller di vista:
-(IBAction)doPresent:(UIView *)sender
{
NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%d", [sender tag]]
withExtension:@"pdf"];
UIWebView *wv = [[[UIWebView alloc] init] autorelease];
UIViewController *vc = [[[UIViewController alloc] init] autorelease];
[vc setView:wv];
UINavigationController *holder = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];
[self presentModalViewController:holder animated:YES];
[wv loadRequest:[NSURLRequest requestWithURL:url]];
UIBarButtonItem *close = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(doDismiss:)] autorelease];
[[vc navigationItem] setRightBarButtonItem:close];
}
-(IBAction)doDismiss:(id)sender
{
[self dismissModalViewControllerAnimated:YES];
}
Non illustrati: il pennino principale contenente questo VC, la sua vista, e cinque pulsanti collegato a doPresent:
, ciascuna etichettati con 1 ... 5; e 1.pdf fino a 5.pdf nel pacchetto dell'app. Eseguilo e funziona come ti aspetteresti, tranne che si blocca dopo una mezza dozzina di visualizzazioni dei PDF.
esecuzione sotto Instruments (accantonamenti) ceduta questa trama interessante:
Il modello che ho notato è che, se visualizzo un PDF e respingerlo senza scorrere intorno al documento, è uscito come previsto con perdita minima. Ma se lo tocco e lo scorrimento, anche un po ', la memoria non viene rilasciata. La visualizzazione dei PDF successivi non sembra riutilizzare la memoria sprecata, ma ognuno ne assegna di più. L'esecuzione nel simulatore e l'attivazione degli avvisi di memoria non ripristinano neanche questa memoria.
Quando l'utilizzo ha colpito ~ 25mb, il programma ha ottenuto 'd. Questo mi sembra poco interessante, il che suggerisce che altre risorse siano trapelate oltre alla memoria delle app.
Questo è su un iPad 1, in esecuzione 4.3, appena riavviato.
Idee? Soluzioni alternative? Omissioni folli da parte mia?
Sembra che si sta creando un nuovo UIWebView ogni volta. È diverso se si ricicla la stessa vista? Una soluzione a un problema vagamente correlato che avevamo era di caricare una pagina vuota come 'about: blank' prima di chiudere qualsiasi visualizzazione web. – drawnonward
Non ho ancora provato il trucco in bianco. potrebbe valere la pena dare un'occhiata – rgeorge
il riciclaggio della vista Web alquanto mitiga, ma non elimina il problema. – rgeorge