多次注册观察者会产生什么影响?

时间:2011-12-27 00:04:11

标签: iphone objective-c nsnotifications

如果我多次注册同一个活动,它会做什么吗?或者我需要多次取消注册?如果是后者,我如何检查我是否已经注册接收特定事件?

3 个答案:

答案 0 :(得分:5)

您将多次收到通知。文档声称在某些情况下你会想要这个,但我想不出任何。

您可以在添加观察者之前立即使用removeObserver:removeObserver:name:object:,以确保不会多次添加。使用实际上没有观察到通知的对象调用removeObserver:没有任何问题。

或者(这可能是最高性能和最可靠的选项)您可以创建自己的NSSet对象来准确存储您添加到该特定通知的对象,并检查您是否是那个对象即将添加副本。

答案 1 :(得分:1)

  

使用实际上没有观察到通知的对象调用removeObserver:没有任何问题。

我试图这样做,因为我认为如果它实现得很好,它就不会抱怨在没有将对象注册为观察者的情况下删除对象。但我有一个例外:

  

***由于未捕获的异常'NSRangeException'而终止应用程序,原因是:'无法删除关键路径“aKeyPath”的观察者,因为它未注册为观察者。'

所以,实际上,如果你是观察者,你必须管理自己。与iOS开发的奢侈品相比,这是非常荒谬的。

答案 2 :(得分:0)

NSString *obString = [NSString stringWithFormat:@"%@", session.observationInfo];
NSRange rangeOfKey = [obString rangeOfString:observedKey];

if (rangeOfKey.location != NSNotFound) {
    //
    NSLog(@"observing");
    [session removeObserver:self forKeyPath:observedKey];
}
else {
    //
    NSLog(@"not observing");
}