5

我有一些使用KVO的代碼很多,並且在多個地方有addObserver:forKeyPath:removeObserver:forKeyPath:。該應用程序偶爾會崩潰,「無法刪除關鍵路徑的觀察者」。從[NSObject removeObserver:forKeyPath:]捕獲異常安全嗎?

我想知道是否可以安全地嘗試/捕捉異常,以防止應用程序崩潰。我知道這不是處理KVO的最佳方法,但我需要花些時間才能清理代碼。

+2

您應該嘗試首先了解故障的性質,然後決定是否可以忽略它。嘗試/ catch將有助於如果你決定如此: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我正在開發的這個項目相當有時間限制,並且崩潰漏洞(就我所見過的beta版測試者而言)僅在5%的時間內出現。我編寫了代碼,以便有時間問題,其中已經從KVO註銷的對象將嘗試再次取消註冊。我測試過捕獲「無法刪除關鍵路徑的觀察者」。沒有副作用的例外情況「據我所見」,但只是想知道它可能是一個多麼嚴重的問題。畢竟Mike提到這是Java中的常見做法。 –

3

是的,利用@try @catch來解決這些類型的KVO衝突是完全可以接受的。

例如:

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

是生產安全的,並且蘋果公司建議作爲適當的異常處理模式。