5

KVO'yu yoğun bir şekilde kullanan ve addObserver: forKeyPath: ve removeObserver: forKeyPath:'u birden çok yerde kullanan bazı kodlarım var. Uygulama bazen "anahtar yol için gözlemciyi kaldıramaz" ile kilitlenir. Sadece/denemek çökmesini uygulamayı önlemek için durum yakalamak için güvenli olacağını[NSObject removeObserver: forKeyPath:] özel bir istisna yakalamak güvenli midir?

merak ediyordum. KVO'yu ele almanın en iyi yaklaşım olmadığını biliyorum, ancak kodu temizleyebilmem için biraz zaman ayırmam gerekiyor. Özellikle iç Elma API'lardan

+2

Muhtemelen ilk olarak başarısızlıkların doğasını anlamaya çalışmalı ve görmezden gelip edemeyeceğinize karar vermelisiniz. Eğer karar verirseniz deneyin/yakalamanız yardımcı olacaktır: http://stackoverflow.com/questions/1582383/how-can-i-tell-if-an-object-has-a-key-value-observer-attached – Tala

cevap

5

İstisnalar, sessizce yakalanıp asla ihmal edilmemelidir. Objective-C uygulamasında, istisnalar genellikle uygulamanızın diğer dillerin ve çalışma zamanlarının aksine (Java, .NET) yakalanmasına neden olur. Bir kilitlenme alıyorsanız

, bir yerlerde bir hata varsa ve bunu düzeltmek gerekir. Bir istisnayı yitirme tutarsız bir duruma girmesi nedeniyle oldukça kötü sonuçlar doğurabilir. Yapma.

+0

Öneri, fazladan zaman gerektiriyorsa ve bir tahliyeyi geciktiriyor olsa bile kodu temizlemektir? Bahsettiğim gibi, kodumu düzeltmem gerektiğini anlıyorum. Sadece bu noktada ekonomiyi denemeye çalışıyorum. Teşekkürler –

+1

@JihoKang Bu yüzden bariz bir hataya sahip bir uygulamayı göndermek mi istiyorsunuz? Etkilerin ne olacağını biliyor musun? Şu anda uygulama çöküyor; İstisna yuttuğunuzda uygulamanızın ne yapacağını düşünüyorsunuz? – Abizern

+0

@Abizern Üzerinde çalıştığım proje oldukça kritiktir ve çökme hatası (beta test cihazları ile gördüğüm kadarıyla) yalnızca% 5'in altında gerçekleşir. Kodu yazdım, böylece KVO'dan daha önce kayıtsız olan bir nesnenin tekrar kaydını almaya çalıştığı zamanlama sorunları nedeniyle durumlar var. "Anahtar yol için gözlemciyi kaldıramayacağım." "Görebildiğim kadarıyla" yan etkileri olmayan istisna, ancak bir sorunun ne kadar kritik olduğunu tam olarak merak ediyordum. Ne de olsa Mike'ın dediği gibi bu, Java'da yaygın bir uygulamadır. –

3

Evet, KVO çatışmaların bu tür çözmek için @try @catch kullanmak tamamen kabul edilebilirdir olabilir. Örneğin

:

@try { 
     [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification]; 
    } 
@catch (NSException *exception) { 
     // observer doesn't exist, do nothing 
    } 

üretim güvenlidir ve uygun istisna işleme deseni olarak Apple tarafından önerilir.

İlgili konular