2016-02-16 5 views
6

çöküyor Bazı göreceli olarak güvenli (benim için) değişiklikler sonra uygulama bazı WebKitLegacy şeyler çökmesini başladı. Kumaşta çok sayıda kaza görüyorum ama yeniden üretilecek kararlı adımları bulamıyorum. Bu kazalara neyin neden yol açabileceğini bilen var mı? Ekli görüntüleri bakınız.iOS: WebKitLegacy

Bazı uygulama ekranları, içeriği görüntülemek için UIWebView kullanıyor - sorunun orada bir yerde olduğunu varsayalım.

enter image description here enter image description here

+0

hedeflediğiniz Ne iOS sürümü? Webview.delegate = nil' ve '[webview stopLoading]' yi nerede arıyorsun? – JAL

+0

iOS7 + 'yı hedefliyorum. Muhtemelen sonraki sürüm 8+ olacak. delegate = nil dealloc olarak adlandırılır. stopLoading, viewWillDisappear'da çağrıldı. – Division

+0

Oldukça eminim bu bir webkit iç hata (iOS 7'de görünen ama iOS 8 ile düzeltildi) Apple'ın resmi çözümünün "iOS 8'e yükseltmek" olduğu yer. Ayrıca 'webview.delegate = nil' ve '[webview stopLoading]' dediğiniz her yerde değiştirmeyi deneyebilirim, 'viewWillDisapear' veya 'dealloc' olarak adlandırmayı deneyin. – JAL

cevap

1

Bildiğim kadarıyla bir Web görünümü (örneğin gömülü görüntüden bir yanıt) bir güncelleme aldığında, o sinyal açıldı hatırlıyorum ama alışık değil çünkü render edilemedi olarak artık ana iş parçacığı tarafından. Bu, ViewController görüntülenmediğinde anlamına gelir.

Eğer durum buysa, sen/iterek başka kahpeden, ağır içerikli bir web sayfası yüklenirken (örneğin, http://edition.cnn.com/ gibi bazı online gazete) ve yükü çalıştıktan hemen sonra web görüntülemesini işten çıkararak sorunu yeniden mümkün olmalıdır ViewController. Bunu düzeltmek için nasıl

: gerçekten de, size söz yöntemleri çağırmak gerekir:

webview.delegate = nil; 
[webview stopLoading]; 

Ancak bunu yapmak için yer asla dealloc üzerine, viewWillDisappear yönteme üzerindedir. Nedeni basit: viewWillDisappear, ViewController'ın ana iş parçacığının denetimini kaybetmek üzere olduğu tam anı çağrılır. Ancak, VC yığına bırakılmak üzere olduğunda dealloc çağrılır. Bu işlem birkaç saniye sonra gerçekleşebilir, uygulamaya kilitlenme için çok değerli bir zaman verebilir veya belki hiç çağrılmayabilir. Her iki yöntemi de hareket ettirmek, hile yapmalıdır.

+1

Web view.delegate = nil 'işlevinin viewWillDisappear'da çağrılması konusunda dikkatli olun çünkü bir web görünümüne sahip görünüm denetleyiciniz başka bir görünüm denetleyicisini zorlarsa, bu görünüm denetleyicisi tarafından temsilci kaybedersiniz açılır ve kullanıcı web görünümü ekranına geri döner. Bunu düzeltmeye yönelik bir yaklaşım, "viewWillAppear" öğesinde "temsilci" yi yeniden ayarlamak olabilir. –

+0

Kesinlikle haklısın :) Açıklama için teşekkürler! – Bartserk

1

UIWebView EXC_BAD_Adresi ... Uygulamanın aldığı sinyal İlk önce, webView.delegate = nil hakkında düşünmelisiniz. Ama nerede ??

Benim deneyim: ViewController bir başka ViewController bir çocuktur

- (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; 
} 

varsa, ın görünümü bir animasyon ile ' ViewController ebeveynden ın görünümü' ViewController kaldırılmasını tetikleyebilir . Aynı zamanda ürününü ViewController ebeveynden kaldırabilir ve referansını kaldırabilirsiniz. Bu noktada ViewControllerde ** WebView temsilci temizlemiş asla ** Kullanım dealloc anlamına denilen asla nil ve viewWillDisappear olmak ve WebView her zaman temizlenir sağlayacaktır.

Diğer mükemmel bağlama ios:EXC_BAD_ACCESS for Webview delegate