NSNotificationCenter为“观察者”和“观察者”保留了哪种类型的参考? “对象?

时间:2009-01-08 18:40:28

标签: cocoa cocoa-touch

任何人都可以澄清/阐明有关-[NSNotificationCenter addObserver:selector:name:object:]的情况吗?

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

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

  • 多线程应用程序有哪些特殊问题,尤其是“对象”参数?

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

  • 此方法行为中移动和桌面环境之间是否存在任何显着差异(从客户角度来看)?

此外,任何指向现有文章的指针都将非常感激。我用谷歌搜索,但很惊讶地发现这些问题的深入讨论(虽然我可能没有使用正确的魔术关键字)。

2 个答案:

答案 0 :(得分:25)

  

保留哪些类型的引用   通知中心   '观察者'和'对象'的论点?

我相信一个弱的参考,虽然这只是来自记忆(没有双关语)。

  

最佳做法是什么?   从观察者中删除   通知中心?

在发布之前,始终从通知中心删除已注册的对象。如果对象的dealloc方法设置了注册本身,或者当另一个对象正在管理通知订阅时释放它,那么该对象的dealloc方法是一个好的地方。记住这一点,上述内容无关紧要。

  

有什么特别的顾虑   多线程应用程序,   特别是WRT'对象'的论点?

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

  

行为有何不同?   这种方法在GC和非GC中的应用   环境?

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

  

是有任何显着差异   (从客户的角度来看)之间   移动和桌面环境   这种方法的行为?

不是我听说过,不是。注册对象时,您可以选择注册所有通知或仅注册来自特定对象的通知。如果您正在大量使用通知,后者可能会快一点,但总是要测试以确保。

  

此外,任何指向现有的指针   涵盖这一点的文章将是   非常感激。我用Google搜索,但是   很惊讶地发现一点点深入   讨论这些问题(尽管如此   也许我没有使用正确的魔法   关键字)。

我认为这更是因为NSNotificationCenter一般来说非常容易使用。如果您担心某些情况,请不要害怕编写快速测试应用程序!

答案 1 :(得分:10)

2016年的现状:

iOS 9 has changed NSNotificationCenter,以便弱引用目标对象。

也就是说当对象被dealloc时你不再需要removeObserver