Ho una vista contenente un UIWebView che sta caricando una mappa di google (quindi un sacco di javascript, ecc.). Il problema che ho è che se l'utente preme il pulsante "indietro" sulla barra di navigazione prima che la visualizzazione web abbia completato il caricamento, non è chiaro a me come comunicare in modo ordinato alla vista Web per interrompere il caricamento e rilasciarlo, senza ottenere messaggi inviati all'istanza deallocata. Inoltre, non sono sicuro che una visualizzazione Web piaccia che la sua vista contenitore scompaia prima che sia terminata (ma non ho scelta se l'utente preme il pulsante Indietro prima che venga caricato).Come arrestare in modo sicuro un UIWebView di caricamento in viewWillDisappear?
Nel mio gestore viewWillDisappear ho questo
map.delegate=nil;
[self.map stopLoading];
questo sembra gestire la maggior parte dei casi OK, come nil'ing il delegato lo interrompe l'invio del didFailLoadWithError al mio controller della vista. Tuttavia se rilascio la visualizzazione Web nel metodo dealloc della mia vista, a volte (a intermittenza) riceverò comunque un messaggio inviato all'istanza deallocata, che sembra essere correlata al javascript in esecuzione nella pagina effettiva, ad esempio:
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
Se semplicemente non rilascio la webview, allora non ottengo questi messaggi anche se penso che sto perdendo la vista sul web.
Se io non mando il messaggio 'StopLoading', e rilasciare semplicemente il WebView entro viewWillDisappear, poi vedo messaggi come questo:
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
eventualmente collegate, a volte (di nuovo totalmente intermittente) ottiene un brutto heisenbug in cui facendo clic sul pulsante Indietro sulla barra di navigazione di un'altra vista verrà visualizzato il titolo, ma non la vista. In altre parole, rimango con il titolo della vista n sullo stack, ma la vista mostrata è ancora la vista n + 1 (il risultato è che sei intrappolato su questo schermo e non puoi tornare alla vista radice - puoi andare altra direzione, ovvero spingere più visualizzazioni e tornare alla vista che non è stata visualizzata correttamente, ma non alla vista radice. L'unica via d'uscita è uscire dall'app). Altre volte la stessa sequenza di spinte e pop sulle stesse viste funziona bene.
Questo particolare mi sta facendo impazzire. Penso che possa essere correlato alla scomparsa della vista prima che venga caricata la vista web, ovvero in questo caso sospetto che possa scrivere sulla memoria e confondere lo stack di visualizzazione. Oppure, questo potrebbe essere completamente non correlato e un bug da qualche altra parte (non sono mai stato in grado di riprodurlo in modalità di compilazione di debug, accade solo con le impostazioni di build di rilascio quando non riesco a guardarlo con gdb :-). Dalle mie sessioni di debug, non penso di esagerare nel rilasciare nulla. E mi sembra di essere in grado di attivarlo solo se a un certo punto ho colpito la vista che ha la vista web, e non succede subito dopo.
Se fossi in te, registrerei un bug con Apple. La vista Web non dovrebbe ricevere alcun messaggio dopo che è stato deallocato: deve terminare l'elaborazione JS e il caricamento dell'URL quando è deallocato. Ho visto il problema degli oggetti di navigazione occasionalmente, ma solo dopo aver installato iPhone OS 3.0 beta. Forse anche questo è un bug del sistema operativo? –
sì è quello che pensavo (dealloc dovrebbe ripulire). I documenti Apple non sono generalmente molto chiari sul contratto con gli oggetti che forniscono. Non ho mai visto la cosa della nav prima e succede abbastanza regolarmente nel mio programma che penso che debba essere qualcosa che sto facendo - si spera legato a questa cosa della webview se riesco a risolverlo. – frankodwyer
oh e per aggiungere, questo succede su 2.2.1 – frankodwyer