如果您将一个对象C对象告诉removeObservers: for一个键路径,而该键路径还没有注册,它就会破解sads。就像-
‘无法从删除密钥路径’theKeyPath‘的观察者,因为它未注册为观察者。’
有没有一种方法可以确定一个对象是否有注册的观察者,这样我就可以这样做了?
if (object has observer){
remove observer
}
else{
go on my merry way
}
发布于 2011-07-16 08:57:38
在您的removeObserver调用周围放置一个try catch
@try{
[someObject removeObserver:someObserver forKeyPath:somePath];
}@catch(id anException){
//do nothing, obviously it wasn't attached because an exception was thrown
}
发布于 2009-10-17 16:28:55
真正的问题是为什么你不知道你是否在观察它。
如果您是在被观察对象的类中执行此操作,请停止。无论是什么在观察,它都希望继续观察它。如果您在观察者不知情的情况下切断了观察者的通知,那么预计事情会崩溃;更具体地说,期望观察者的状态变得陈旧,因为它不会从以前观察到的对象接收更新。
如果您是在观察对象的类中执行此操作,则只需记住您正在观察哪些对象(或者,如果您只观察过一个对象,请记住您是否正在观察它)。这是假设观察值是动态的,并且在两个不相关的对象之间;如果观察者拥有观察者,只需在创建或保留观察者之后添加观察者,并在释放观察者之前删除观察者。
添加和删除作为观察者的对象通常应该发生在观察者的类中,而不应该发生在被观察对象的类中。
发布于 2012-02-17 11:08:28
如果someObject
没有任何观察者,那么[someObject observationInfo]
似乎是nil
。然而,我不会相信这种行为,因为我还没有看到它的文档。另外,我不知道如何阅读observationInfo
来获得特定的观察者。
https://stackoverflow.com/questions/1582383
复制相似问题