2

参考文献中,我看到可以使用空观察者指针向通知注册观察者。但是,这两种删除方法都需要一个非 NULL 的有效指针值。当没有注册完成时,我该如何克服?

我还在这个答案示例中注意到CFNotificationCenter 使用示例?删除是使用 NULL 完成的,但再次根据参考资料 - 这是错误的。

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

任何解释都非常感谢!

4

1 回答 1

4

发送观察者并没有真正的惩罚(这是 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*,它对内容一无所知。

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

于 2013-04-18T12:10:16.770 回答