2011-03-18 11 views
6

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: plot of memory usage

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?

+1

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

+0

Non ho ancora provato il trucco in bianco. potrebbe valere la pena dare un'occhiata – rgeorge

+0

il riciclaggio della vista Web alquanto mitiga, ma non elimina il problema. – rgeorge

risposta

2

Bene, Apple mi ha finalmente restituito il bug report e riconoscono il bug e sostengono che è stato corretto nelle ultime build di ios 5.x. Vedremo.

+0

Ho lo stesso problema e ho provato diversi modi per presentare il PDF, inclusa la classe Leaves. Il risultato è sempre stato lo stesso e alla fine l'app si blocca dopo aver caricato 8-9 PDF. Non vedo l'ora di provarlo su IOS 5 dopo aver visto il tuo post. –

+0

@rgeorge è ora riparato? – KarenAnne

+0

Link al numero e risposta di Apple? – SteakOverflow

1

Penso che l'utente: "drawnonward" è su qualcosa. Guardando il tuo codice, con ogni pulsante premuto non solo si assegna e si inizia una nuova webview, ma anche un nuovo UIViewController e un nuovo UINavigationController. A meno che non sia assolutamente necessario creare una nuova istanza di ciascuno di questi oggetti ogni volta che viene premuto un pulsante, è necessario ricodificare il codice in modo da disporre di una sola istanza di ciascun oggetto, quindi con ogni pulsante premere carica il nuovo contenuto nella vista Web .

Penso che ci siano davvero buone possibilità che questo risolva il tuo problema.

+0

... ma io non * scrivo * loro, che è la cosa. Usare UINavigationControllers come throwaway è un modello OK, approvato da Apple, che ho usato con grande efficacia altrove, ed è sicuro finché si pulisce da solo. – rgeorge

+0

Non ricordo di averti fatto trapelare. Il punto che vorrei sottolineare è che riciclando NavController, ViewController e WebView, è possibile ridurre al minimo le allocazioni, che (in teoria) potrebbero anche risolvere il problema. Quando si imposta un oggetto su autorelease, non rilascia il secondo che si è fatto con l'oggetto, ma aggiunge l'oggetto al pool. L'oggetto rimane in memoria finché il pool non è esaurito. In ogni caso, si spera che Apple abbia corretto questo problema per iOS 5. – EmphaticArmPump

1

Nel mio caso ritorno sempre dal PDF nella visualizzazione Web. Se Scoll verso l'alto utilizzando qualcosa di simile a questo:

for (UIView *subview in webView.subviews) 
{ 
    if ([subview isKindOfClass:[UIScrollView class]]) 
     [subview setContentOffset:CGPointZero animated:NO]; 
} 

Sembra di risolvere il problema

+0

Stavo avendo un problema simile con UIWebView che si bloccava sull'iPad quando ho chiuso UIViewController e il contenuto stava ancora scorrendo attivamente al momento a causa dell'effetto "inerzia". Questo l'ha risolto per me. – avance

Problemi correlati