在reference中,我看到使用null观察者指针注册观察者是可能的。但是,两个remove方法都需要一个非NULL的有效指针值。如果在没有注册的情况下完成注册,我该如何克服?
我也注意到在这个答案示例中CFNotificationCenter usage examples?删除是用NULL完成的,但是再次根据引用 - 这是错误的。
那么,用NULL观察者删除注册的正确方法是什么? 它们是不是应该被删除(它们只是留在那里,直到因应用程序退出而清除内存?)
非常感谢任何解释!
答案 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}}的相等性,它对内容一无所知。
作为进一步的解释,这种模式的原因是你可以使用一个回调来处理多个观察者。