2016-02-16 30 views
6

Dopo alcune modifiche relativamente sicure (come per me), l'app ha iniziato a bloccarsi su alcuni elementi di WebKitLegacy. Vedo molti arresti anomali in Fabric ma non riesco a trovare passaggi stabili da riprodurre. Qualcuno sa cosa può causare quegli arresti anomali? Si prega di vedere le immagini allegate.iOS: WebKitLegacy si arresta in modo anomalo

Alcune schermate dell'app utilizzano UIWebView per visualizzare il contenuto: presumo che il problema sia da qualche parte lì.

enter image description here enter image description here

+0

Quale versione iOS stai rivolge? Dove stai chiamando 'webview.delegate = nil' e' [webview stopLoading] '? – JAL

+0

Mi rivolgo a iOS7 +. Probabilmente la prossima versione avrà 8+. delegate = nil è chiamato in dealloc. stopLoading viene chiamato in viewWillDisappear. – Division

+0

Sono abbastanza sicuro che si tratta di un bug interno del webkit (che è apparso su iOS 7 ma è stato corretto con iOS 8) dove la soluzione ufficiale di Apple sarà "l'aggiornamento a iOS 8." Cercherò anche di cambiare ovunque tu stia chiamando 'webview.delegate = nil' e' [webview stopLoading] ', prova a chiamarlo in' viewWillDisapear' o 'dealloc'. Le statistiche – JAL

risposta

1

Per quanto mi ricordo, quel segnale spuntato quando un Webview ricevuto un aggiornamento (per esempio, una risposta da un'immagine incorporata), ma non potrebbe essere resa perché non è usato dal thread principale più. Ciò significa che quando ViewController non viene visualizzato.

Se questo è il caso, si dovrebbe essere in grado di riprodurre il problema caricando una pagina web con contenuti pesanti (ad esempio, qualche giornale online come http://edition.cnn.com/) e respingendo il WebView subito dopo l'avvio del carico, spingendo/popping un'altra ViewController.

Come risolvere il problema: infatti, è necessario chiamare i metodi che hai menzionato:

webview.delegate = nil; 
[webview stopLoading]; 

Tuttavia, il posto per farlo è il metodo viewWillDisappear, mai dealloc. Il motivo è semplice: viewWillDisappear viene chiamato nel momento esatto in cui il ViewController sta per perdere il controllo del thread principale. Tuttavia, dealloc viene chiamato quando VC sta per essere rilasciato nell'heap. Questo potrebbe accadere alcuni secondi dopo, dando all'app un po 'di tempo prezioso per andare in crash, o forse non verrà mai chiamato. Spostare entrambi i metodi dovrebbe fare il trucco.

+1

Fai attenzione a chiamare 'webview.delegate = nil' in' viewWillDisappear' perché se il tuo controller di visualizzazione con una visualizzazione Web spinge qualsiasi altro controller di visualizzazione, perderai il delegato quando quel controller di visualizzazione viene visualizzato e l'utente ritorna sulla schermata di visualizzazione Web. Un approccio per risolvere questo problema potrebbe essere quello di reimpostare 'delegate' in' viewWillAppear'. –

+0

Hai perfettamente ragione :) Grazie per il chiarimento! – Bartserk

1

UIWebView EXC_BAD_Address ... Segnale ricevuto dall'applicazione Prima di tutto, dovresti pensare a webView.delegate = nil. Ma dove ??

La mia esperienza:

- (void)dealloc{ 
    /* 
    Important 
    Before releasing an instance of UIWebView for which you have set a delegate, 
    you must first set the UIWebView delegate property to nil before disposing of the UIWebView instance. 
    This can be done, for example, in the dealloc method where you dispose of the UIWebView. 
    */ 
    if (_webView.loading) { 
     [self.webView stopLoading]; 
    } 
    _webView.delegate = nil; 
} 

se il ViewController è un figlio di un altro ViewController, è possibile innescare la rimozione della ViewController 'vista s dal genitore ViewController' s vista con un'animazione . Allo stesso tempo, è possibile rimuovere il ViewController dal relativo genitore e nil fuori il suo riferimento. a questo punto ViewControllersarà nullo e viewWillDisappearsarà mai essere chiamato, che significa ** il delegato WebView non potrà mai essere ripulito ** Usa dealloc e garantire che il vostro WebView è sempre ripulito.

Altro eccellente collega ios:EXC_BAD_ACCESS for Webview delegate

Problemi correlati