在参考文献中,我看到可以使用空观察者指针向通知注册观察者。但是,这两种删除方法都需要一个非 NULL 的有效指针值。当没有注册完成时,我该如何克服?
我还在这个答案示例中注意到CFNotificationCenter 使用示例?删除是使用 NULL 完成的,但再次根据参考资料 - 这是错误的。
那么,删除使用 NULL 观察者完成的注册的正确方法是什么?他们不应该被删除吗(他们只是留在那里直到由于应用程序退出而清除内存??)???
任何解释都非常感谢!
在参考文献中,我看到可以使用空观察者指针向通知注册观察者。但是,这两种删除方法都需要一个非 NULL 的有效指针值。当没有注册完成时,我该如何克服?
我还在这个答案示例中注意到CFNotificationCenter 使用示例?删除是使用 NULL 完成的,但再次根据参考资料 - 这是错误的。
那么,删除使用 NULL 观察者完成的注册的正确方法是什么?他们不应该被删除吗(他们只是留在那里直到由于应用程序退出而清除内存??)???
任何解释都非常感谢!
发送观察者并没有真正的惩罚(这是 a void *
,并且根本不被系统解释)。首选用例是,如果您要删除观察者,您应该向observer
初始CFNotificationCenterAddObserver
调用和后续调用发送一个CFNotificationCenterRemoveObserver
。
例如,似乎将 NULL 传递给 Add 和 Remove 确实有效,但正如您指出的那样,这样做会破坏 API 合同,因此我不建议在运输代码中使用它。
它observer
本身通常只是一个字符串指针,只要传入相同的指针,就可以了。
char *myObserver="anObserver";
CFNotificationCenterAddObserver ( notificationCenter, (void*)myObserver, myCallback, NULL, NULL, CFNotificationSuspensionBehaviorDrop);
然后:
CFNotificationCenterRemoveObserver ( notificationCenter, (void*)myObserver, NULL, NULL);
确保使用相同的字符串指针,而不仅仅是相同的字符串,因为 Foundation 只检查 的相等性void*
,它对内容一无所知。
通过进一步的解释,这种模式的原因是您可以使用单个回调来处理多个观察者。