5

私はKVOを頻繁に使用するコードを持っており、addObserverを持っています:forKeyPath:removeObserver:forKeyPath:複数の場所です。このアプリは、「キーパスのためにオブザーバーを削除できません」というときにクラッシュすることがあります。[NSObject removeObserver:forKeyPath:]から例外をキャッチするのは安全ですか?

アプリがクラッシュするのを防ぐために、例外をキャッチするだけで安全かどうか疑問に思っていました。私はそれがKVOを扱う上で最善の方法ではないことを知っていますが、コードを整理するまでには少し時間を掛ける必要があります。

+2

おそらく最初に失敗の性質を理解し、それを無視できるかどうかを判断するようにしてください。試してみると、それを決めるのが助かります:http://stackoverflow.com/questions/1582383/how-can-i-tell-if-an-object-has-a-key-value-observer-attached – Tala

答えて

5

特にApple社の内部APIからの例外は、静かにキャッチされて無視されるべきではありません。 Objective-Cでは、他の言語やランタイム(Java、.NET)と異なり、例外をキャッチするのが通常の開発の部分であるため、例外によってアプリが終了する必要があります。

クラッシュする場合は、どこかにバグがあり、修正する必要があります。例外を呑み込むと、一貫性のない状態になるため、かなり悪い結果を招く可能性があります。それをしないでください。

+0

余分な時間を要し、リリースを遅らせても、コードをクリーンアップすることをお勧めしますか?私が言及したように、私は自分のコードを修正する必要があることを理解しています。この時点で経済学を試してみるだけです。ありがとうございます –

+1

@JihoKangだからあなたは明らかなバグを持っているアプリを出荷したいですか?あなたは効果がどんなものになるか知っていますか?今、アプリはクラッシュしています。例外を飲み込むと、あなたのアプリはどうなると思いますか? – Abizern

+0

@Abizern私が取り組んでいるプロジェクトはかなり時間が重要で、クラッシュバグ(私がベータテスターで見た限り)は5%の時間内にのみ発生します。私はすでにKVOから登録を解除したオブジェクトが再び登録解除しようとするタイミングの問題に起因するケースがあるようにコードを書いています。私は "キーパスのためにオブザーバーを取り除くことはできません"というキャッチをテストしました。例外は「私が見る限りでは」副作用がなく、問題の重要性を正確に突き止めていただけです。結局のところ、Mikeがこれを言いましたが、これはJavaの一般的なプラクティスです –

3

はい、これらの種類のKVO競合を解決するには、@ try @catchを利用することは完全に容認できます。例えば

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

は、生産安全であり、適切な例外処理パターンとしてApple社によって提案されました。

関連する問題