删除可能不存在的NSNotification观察者

时间:2014-08-25 16:40:26

标签: objective-c nsnotificationcenter

我似乎无法就此主题找到明确的答案。

是否可以删除可能不存在的观察者?

示例代码:

-(void)commonInit{

    [[NSNotificationCenter defaultCenter]removeObserver:self];


    [[NSNotificationCenter defaultCenter]addObserver:self
                                        selector:@selector(userDidChangePrecision:)
                                            name:kUser_Changed_Precision
                                          object:nil];

 } 


-(void)dealloc{

    [[NSNotificationCenter defaultCenter]removeObserver:self];

    [super dealloc];

}

这可以防止在运行时可以重新初始化对象的情况下为对象初始化多个观察者。

2 个答案:

答案 0 :(得分:3)

来自Apple文档的

片段:

- (void)removeObserver:(id)notificationObserver
    Parameters
    *notificationObserver*
        The observer to remove. Must not be nil.

- (void)removeObserver:(id)notificationObserver name:(NSString *)notificationName object:(id)notificationSender
    Parameters
    *notificationObserver*
        Observer to remove from the dispatch table. Specify an observer to remove only entries for this observer. Must not be nil, or message will have no effect.

在这两种情况下,观察者不是零的警告被夸大了;在这两种情况下,效果都是此消息无效。编译器和运行时错误,没有僵尸,& c。

同样,指定一个没有观察的观察者也没有效果。

不是明确的答案,但是基于对试错法代码的观察和调查,例如:

[[NSNotificationCenter defaultCenter] removeObserver:nil]; [[NSNotificationCenter defaultCenter] removeObserver:[UIView new]];

答案 1 :(得分:3)

我无法找到关于是否允许删除不存在的观察者的确切文档,但我认为可以通过这种方式阅读NSNotificationCenter文档。它说removeObserver:name:object:删除匹配的观察者。我只是假设这包括没有匹配的观察者。

但是这也是你的方法可能有害的另一个原因:当你的commonInit方法被调用时,其他代码(子类或超类的init)可能已经注册了通知。在子类化UIViewController时甚至可能(对于内存警告)。

所以我要说你不应该无条件地从通知中心取消注册,除非是dealloc。