2016-11-18 39 views
0

有沒有辦法知道在視圖控制器的鍵路徑上是否有對象偵聽。例如,我在我的ViewControlleriOS應用程序崩潰,因爲KVO觀察者不再觀察

[tabBarController addObserver:self 
    forKeyPath:@"selectedViewController" 
    options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
    context:&PrivateKVOContext 
]; (edited) 

而且我想知道如果我的tabbarcontroller知道我的視圖 - 控制是對的keyPath

的原因是聽,因爲我的應用程序崩潰,因爲標籤欄控制器還自以爲我的視圖控制器是聽,即使我的視圖控制器已釋放

而在我的視圖控制器的dealloc方法是關鍵路徑上,我把[tabBarController removeObserver:self forKeyPath:@"selectedViewController」];以去掉自己作爲一個觀察者

+0

如果觀察者是沒有得到清除,試着寫'[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere]'的'viewWillDisappear ' – pkc456

+0

切線類型,但爲什麼選擇不同選項卡時,選項卡欄控制器中的視圖控制器應該如何處理?這聽起來像一個糟糕的設計。 – rmaddy

+0

你爲什麼不繼承tabBarController並創建協議,使用它你可以發送更改selectedViewController的委託消息。這將是更清晰的解決方案。 –

回答

0

可悲的是沒有。沒有辦法檢查哪些對象當前正在觀察其他對象。

因此,通常建議您將removeObserver:置於補充方法中,將addObserver:置於addObserver:之後,這樣可以可靠地將其稱爲相同的次數。

在這種情況下,因爲你把它的dealloc,這就是所謂的視圖控制器的生命週期結束時,你應該把addObserver:init方法,它會在被稱爲最開始。

-1

這取決於如果觀察者確實在使用中,在你的代碼,試試這個:

- (void)dealloc { 

    @try { 
     [[NSNotificationCenter defaultCenter] removeObserver:Notification_Location_Ready]; 
    } @catch (NSException *exception) { 

    } @finally { 

    } 
} 
+2

**請不要**使用此。 'try-catch'是一個完整**糟糕的習慣**。這隻會隱藏代碼中的顯而易見的錯誤,它不會修復它。相反,他應該創建一些結構以保持對觀察者的引用,然後在適當時刪除它們。 –