2015-02-09 17 views
6

Il mio progetto è un lib statico ibrido per mostrare un UIWebView con alcuni JS per controllare la logica. Quando uso 64 bit ed eseguo demo su iOS 8/iPhone 6, la memoria continua a 30M o più!Perdita di memoria con UIWebView

  1. Quando uso nella generazione strumento, l'utilizzo di memoria aumentata è quasi tutto da WebCore; significa che ci sono perdite nel codice JS? Non riesco a trovare una perdita quando utilizzo Safari per eseguire direttamente JS simili.

  2. Quando rilascio UIWebView, la memoria non viene ancora liberata; Ho provato con l'assegnazione dello strumento. Ci sono alcuni webcore e (non oggetti) ancora in memoria, cosa posso fare per rilasciarli?

    • 0JavaScriptCore WTF :: MallocHook :: recordAllocation (void *, unsigned long)
    • 1 JavaScriptCore WTF :: fastMalloc (più firmato)
    • 2 WebCore WebCore :: SharedBuffer :: tampone() const
    • 3 WebCore WebCore :: :: SharedBuffer dati() const
    • 4 WebCore WebCore :: :: ResourceLoader didReceiveDataOrBuffer (const char *, unsigned int, WTF :: PassRefPtr, lunga lunga, WebCore :: DataPayloadType)
    • 5 WebCore WebCore :: SubresourceLoader :: di dReceiveDataOrBuffer (const char *, int, WTF :: PassRefPtr, lunga lunga, WebCore :: DataPayloadType)
    • 6 WebCore WebCore :: :: SubresourceLoader didReceiveBuffer (WTF :: PassRefPtr, lunga lunga, WebCore :: DataPayloadType)
    • 7 WebCore WebCore :: :: ResourceLoader didReceiveBuffer (WebCore :: ResourceHandle *, WTF :: PassRefPtr, int)
    • 8 WebCore WebCore :: :: SynchronousResourceHandleCFURLConnectionDelegate didReceiveDataArray (__ CFArray const *)

I usa il seguente codice

-(void)createUIWebview{ 
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:serviceUrl]]]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"]; 
} 

-(void)dealloc{ 
if (_webView.isLoading){ 
    [_webView stopLoading]; 
} 
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
_webView.delegate=nil; 
[_webView removeFromSuperview]; 
[_webView release]; 
_webView = nil; 
} 

ho studiato i seguenti link, ma non sembrano risolvere il mio problema. UIWebview sta ancora perdendo in iOS 8? E il problema non sembra così ovvio quando uso iOS 6 in iPhone4.

Whats the proper way to release a UIWebView?

iOS 8 UIWebView memory management

UIWebView leaks, JS Garbage Collector & WebCore VMs

Release memory/cookie/cache from UIWebView once closed

risposta

6

ho avuto lo stesso problema e passato alla nuova WKWebView e risolto immediatamente tutti i problemi di perdita di memoria che stavo vedendo. WKWebView condivide molti degli stessi nomi di chiamata da UIWebView quindi tutto ciò che dovevo fare sul mio progetto è passare tutti gli oggetti `UIWebView 'a' WKWebView 'e le perdite di memoria sparivano.

Ricordati di importare il WebKit nel progetto e sapere che è disponibile solo su iOS8.

Apple Documentation

+0

'WKWebView' non eredita da' UIWebView', è una classe completamente nuova e diversa. Se sei su iOS 8, devi assolutamente usarlo su 'UIWebView'. Dovresti anche usare ARC. –

+0

@jshier - Grazie per il trucco ... Ho modificato la risposta da ciò che intendevo dire (che è che condividono molti degli stessi nomi di chiamata del metodo che lo rendono un interruttore molto semplice). –

+0

grazie mille per la soluzione, WKWebView funziona per il mio caso! –

0

Ho avuto un problema simile, avendo gli utenti testare l'applicazione in anteprima le immagini in UIWebView. L'app si bloccherebbe dopo N anteprime. Utilizzo dello strumento Apple Instruments con il modello di profilazione di allocazioni. Dallo strumento, sono stato in grado di selezionare la seguente durata di allocazione: "Creato & persistente". Ulteriori osservazioni sono quando si visualizza in anteprima lo stesso file più volte, Persistente (in base alla definizione di Apple, questo è il numero di byte che sono stati allocati, ma non rilasciati.) Per ImageIO_jpeg_Data continua a crescere in doppio, questo è vero per qualsiasi altro tipo di immagine .

Una risoluzione per questo è utilizzare UIImageView di Apple come un anteprima separato per Immagini, questo non causa alcuna perdita di memoria durante l'anteprima delle immagini.