CFNotificationCenterRemoveObserver观察者

时间:2013-04-18 11:48:04

标签: objective-c macos

reference中,我看到使用null观察者指针注册观察者是可能的。但是,两个remove方法都需要一个非NULL的有效指针值。如果在没有注册的情况下完成注册,我该如何克服?

我也注意到在这个答案示例中CFNotificationCenter usage examples?删除是用NULL完成的,但是再次根据引用 - 这是错误的。

那么,用NULL观察者删除注册的正确方法是什么? 它们是不是应该被删除(它们只是留在那里,直到因应用程序退出而清除内存?)

非常感谢任何解释!

1 个答案:

答案 0 :(得分:3)

发送观察者没有真正的惩罚(这是一个void *,而根本没有被系统解释。首选用例是,如果您要删除观察者,则应向observer初始CFNotificationCenterAddObserver和后续CFNotificationCenterRemoveObserver发送observer

例如,似乎将NULL添加到“添加”和“删除”实际上都有效,但正如您所指出的那样,它违反了API合同,因此我不建议在运输代码中使用它。

char *myObserver="anObserver"; CFNotificationCenterAddObserver ( notificationCenter, (void*)myObserver, myCallback, NULL, NULL, CFNotificationSuspensionBehaviorDrop); 本身通常只是一个字符串指针,只要你传入相同的指针,你应该没问题。

CFNotificationCenterRemoveObserver ( notificationCenter, (void*)myObserver, NULL, NULL);  

以后:

void*

确保使用相同的字符串指针,而不仅仅是相同的字符串,因为Foundation只检查{{1}}的相等性,它对内容一无所知。

作为进一步的解释,这种模式的原因是你可以使用一个回调来处理多个观察者。