Sto cercando di risolvere un sacco di perdite che il mio UIWebView
sta causando e non è in grado di trovare la loro origine né una soluzione alternativa. Quello che faccio è di ottenere alcuni contenuti dal web attraverso una richiesta di rete, poi assemblare il mio HTML e caricarlo al volo:Perdite di memoria con UIWebView e Javascript
NSString* body = <some HTML>;
NSString* html = [NSString stringWithFormat:kHTMLTemplate, [self scripts], [self styles], body];
[_webView loadHTMLString:html
baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
Ogni volta che c'è nuovi contenuti disponibili, eseguo loadHTMLString
di nuovo per aggiornare la visualizzazione Web . Riuso la stessa vista web, stesso controller, stesso tutto.
Instruments mostra un modello molto strana in cui tutti gli oggetti fuoriusciti sono generali blocchi di varie dimensioni e nessuno di loro ha tutte le informazioni ad esso collegato: nessuna libreria responsabile, nessuna cornice responsabile, ecc Ogni volta che viene eseguita loadHTMLString
, vengono aggiunte nuove perdite.
Sembra che ci siano diversi thread in S.O. circa UIWebView
perdite di memoria. Ho provato tutti i suggerimenti che ho trovato (ad esempio, impostando lo NSURLCache
su zero o resettandolo, ho provato a rilasciare l'UIWebView esistente e ne alloco uno nuovo ogni volta che ho nuovi dati, ecc.) Ma nulla ha aiutato.
Le mie indagini finora portano a un risultato chiaro: sembra che le perdite siano presenti solo se l'HTML che carico nella vista contiene alcuni Javascript. Se si nota la stringa html
sopra, è composta da diversi componenti; uno è [self scripts]
che è una funzione che restituisce semplicemente:
return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>"
"<script type='text/javascript' src='jmy.js'></script>";
Se rimuovo questo, perdite ci sono. Ma le perdite appaiono non appena aggiungo un tag <script>
al mio HTML. Hanno anche visualizzati se ho semplicemente includere il file jquery (o qualsiasi altro file js, come a questo):
return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>";
Quindi, la domanda: qualcuno ha un'idea su ciò che sta succedendo qui? Includere chiaramente un file Javascript nel mio codice HTML sta rendendo la memoria perdite UIWebView
.
Il fatto che le perdite appaiono sia quando ho riutilizzare lo stesso UIWebView
oggetto o quando un'istanza di un nuovo ogni volta che ho contenuto, mi porta a pensare che ci deve essere qualcosa nel modo in cui i file javascript sono gestite da loadHTMLString
che conduce alle perdite.
Qualcuno sa come potrebbe essere risolto?
Questo potrebbe essere un bug in UIWebView. http://blog.techno-barje.fr/post/2010/10/04/UIWebView-secrets-part1-memory-leaks-on-xmlhttprequest/ –
@ H2CO3: grazie, ho anche provato che ... nessun miglioramento. .. – sergio
pensa che siamo salvati da iOS 8. Leggi questa risposta su WKWebView http://stackoverflow.com/questions/16514230/massive-memory-leak-in-ios-uiwebview –