2014-09-27 25 views
6

Ho un'applicazione gerarchica (NavigationController) con una semplice visualizzazione tabella in un ruolo del controller principale. Ogni volta che selezioni una cella, hai una nuova vista con alcune informazioni sui dettagli (gestita da DetailViewController). Sul lato della vista DetailViewController ho un UIWebView per visualizzare i dati da Internet. Ma il problema si verifica quando guardo l'utilizzo della memoria. Ogni nuova vista aperta di DetailViewController con il suo contenuto caricato dal web tramite UiWebView porta più memoria utilizzando il coefficiente. Mi piacerebbe scaricare tutto e rilasciare la memoria allocata per quei dati quando torno alla vista del mio controller di root.iOS 8 Gestione memoria UIWebView

Come posso gestire il problema? Ho provato a stopLoading: il metodo di istanza di UIWebView per risparmiare memoria, ma non risolve neanche il problema. Così come non capisco completamente il processo di lavoro di ARC, non posso assicurarmi se è normale avere una memoria maggiore usando il coefficiente con ogni nuova vista di dettaglio aperta.

Grazie in anticipo!

risposta

9

Alcune cose da notare. UIWebView "perdite". Sta perdendo da almeno iOS4. Con ogni carico di pagina di grandi dimensioni, sembra crescere e la memoria non viene completamente riempita quando viene rilasciato l'oggetto UIWebView. Se questa memoria rimane in una cache e viene rilasciata quando realmente necessario, o una perdita, non sono stato in grado di rispondere correttamente. Questo è un po 'migliorato nel corso degli anni, ma può ancora essere visto usando il grafico di allocazione della memoria di Instruments.

Iniziamo dalle basi. Prima di iniziare a modificare il tuo design, prova ad usare gli strumenti per vedere cosa sta perdendo. È anche possibile creare sottoclassi delle visualizzazioni e visualizzare i controller, implementare i loro metodi dealloc e assicurarsi che vengano rilasciati correttamente quando previsto. Molte volte, specialmente quando sono coinvolti blocchi, le persone creano cicli di conservazione, che causano enormi perdite di memoria. Fai prima questo.

Ecco alcune raccomandazioni dalla mia esperienza di lavoro con WebKit:

  • riutilizzo vista il web il più possibile. Se puoi, usa lo stesso oggetto e aggiungilo come sottoview delle viste dei controller della vista.
  • Abbiamo notato che il massimo che abbiamo potuto scaricare dalla visualizzazione Web era aprire una pagina vuota prima di rilasciare l'oggetto UIWebView.
  • iOS8 supporta un nuovo modello funzionante con WebKit: WKWebView (WebKit2). In questo modello, il contenuto web è gestito e disegnato fuori processo e la memoria viene "trapelata" in quel processo. Se necessario, il sistema operativo ucciderà questi processi WebKit, consentendo così alla tua app di funzionare. Puoi provare questo e vedere se hai miglioramenti.