Cocoa NSNotificationCenter为';观察员';标准普尔';对象';s

Cocoa NSNotificationCenter为';观察员';标准普尔';对象';s,cocoa,cocoa-touch,Cocoa,Cocoa Touch,是否有人可以澄清/阐明有关-[NSNotificationCenter addObserver:selector:name:object:][/code>的情况 “观察者”和“对象”参数的通知中心保留哪些类型的引用 从通知中心删除观察员的最佳做法是什么 对于多线程应用程序,特别是“对象”参数,有哪些特别的关注点 此方法在GC和非GC环境中的行为有什么不同 在这种方法的行为中,移动环境和桌面环境之间是否存在显著差异(从客户端的角度来看) 此外,任何指向现有文章的指针都将不胜感激。我在谷歌上搜索

是否有人可以澄清/阐明有关
-[NSNotificationCenter addObserver:selector:name:object:][/code>的情况

  • “观察者”和“对象”参数的通知中心保留哪些类型的引用

  • 从通知中心删除观察员的最佳做法是什么

  • 对于多线程应用程序,特别是“对象”参数,有哪些特别的关注点

  • 此方法在GC和非GC环境中的行为有什么不同

  • 在这种方法的行为中,移动环境和桌面环境之间是否存在显著差异(从客户端的角度来看)

此外,任何指向现有文章的指针都将不胜感激。我在谷歌上搜索了一下,但惊讶地发现这些问题几乎没有深入的讨论(尽管可能我没有使用正确的神奇关键词)

哪些类型的参考文献由 通知中心 “观察者”和“对象”参数

我相信这是一个很弱的引用,尽管这只是出于记忆(没有双关语的意思)

最佳实践是什么 将观察员从 通知中心

在发布注册对象之前,请始终从通知中心中删除这些对象。如果对象的dealloc方法本身设置了注册,或者如果另一个对象正在管理通知订阅,则当您释放它时,该对象的dealloc方法是一个很好的位置。记住这一点,以上这些都无关紧要

有什么特别需要关注的 多线程应用程序, 尤其是“object”参数

NSNotificationCenter在线程上运行良好,但是如果您从后台线程发送通知,对象将在同一线程上接收该通知。由于这种行为,如果您正在更新UI或执行任何其他非线程安全的操作(或从主线程上的另一个方法发送通知),则应该使用不同的方法

行为上有什么不同 该方法在GC和非GC中的应用 环境

我不记得听说过任何你需要担心的事情,尽管我还没有太多地使用GC

结果是否有显著差异 (从客户的角度)在 中的移动和桌面环境 这种方法的行为

我没听说过,没有。当你注册你的对象时,你可以选择注册所有通知,或者只注册来自某个对象的通知。如果您大量使用通知,后者可能会快一点,但一定要进行测试

此外,任何指向现有 涉及这方面的文章将是 非常感谢。我在谷歌上搜索过,但是 我惊讶地发现没有什么深入的研究 对这些问题的讨论(尽管 也许我没有使用正确的魔法 关键词)


我认为这更多是因为NSNotificationCenter总体上非常易于使用。如果您担心某些情况,请不要害怕编写快速测试应用程序

2016年的现状:

NSNotificationCenter
以使其弱引用目标对象


也就是说,当对象被解除锁定时,您不再需要
removeObserver
in。

thx用于编辑chris。特别是在GC下使用NSNotificationCenter时,您不需要发出removeObserver:messages,当您的对象最终确定时,中心对它的任何引用都将被清除。从文档中,
NSNotificationCenter
对涉及的所有对象使用不安全的非保留引用(而不是将弱引用归零)。这是因为在解除分配任何对象之前必须调用
removeObserver