最近遇到一個問題,更改 window.rootViewController 時,導(dǎo)致某個頁面 dealloc 時,移除觀察者,導(dǎo)致 Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <SubViewController 0x7fc175001d60> for the key path "age" from <Person 0x7fc172da5be0> because it is not registered as an observer 崩潰,大概意思就是不能移除不存在的觀察者。
在 viewdidload 里面添加的觀察者,為什么會代碼不走呢?
window.rootViewController,原來的如果是一個 tabbarViewController,默認(rèn)是加載第一個頁面,如果不切換 tabbar,其他頁面 viewDidLoad 是不走的,這就導(dǎo)致了 觀察者沒有創(chuàng)建了,當(dāng)切換 rootViewController 時,原來的 tabbarViewController 的子控制器都會 dealloc,導(dǎo)致崩潰。
蘋果系統(tǒng)并沒有提供判斷是否有某個觀察者的方法,我們通過 try {} catch {} 來解決,當(dāng)然也有其他方法
- (void)dealloc {
@try {
// 移除觀察者
}
@catch (NSException *exception) {
NSLog(@"沒有該觀察者");
}
}