任何人都可以澄清/阐明有关-[NSNotificationCenter addObserver:selector:name:object:]
的情况吗?
“观察者”和“对象”参数的通知中心保留了哪些类型的引用?
从通知中心删除观察员的最佳做法是什么?
多线程应用程序有哪些特殊问题,尤其是“对象”参数?
此方法在GC和非GC环境中的行为有何不同?
此方法行为中移动和桌面环境之间是否存在任何显着差异(从客户角度来看)?
此外,任何指向现有文章的指针都将非常感激。我用谷歌搜索,但很惊讶地发现这些问题的深入讨论(虽然我可能没有使用正确的魔术关键字)。
答案 0 :(得分:25)
保留哪些类型的引用 通知中心 '观察者'和'对象'的论点?
我相信一个弱的参考,虽然这只是来自记忆(没有双关语)。
最佳做法是什么? 从观察者中删除 通知中心?
在发布之前,始终从通知中心删除已注册的对象。如果对象的dealloc方法设置了注册本身,或者当另一个对象正在管理通知订阅时释放它,那么该对象的dealloc方法是一个好的地方。记住这一点,上述内容无关紧要。
有什么特别的顾虑 多线程应用程序, 特别是WRT'对象'的论点?
NSNotificationCenter适用于线程,但如果您从后台线程发送通知,该对象将在同一个线程上接收它。由于这种行为,如果您正在更新UI或执行其他非线程安全的操作(或者从主线程上的其他方法发送通知),则应使用不同的方法。
行为有何不同? 这种方法在GC和非GC中的应用 环境?
我不记得听到过你需要担心的任何事情,尽管我还没有使用过GC。
是有任何显着差异 (从客户的角度来看)之间 移动和桌面环境 这种方法的行为?
不是我听说过,不是。注册对象时,您可以选择注册所有通知或仅注册来自特定对象的通知。如果您正在大量使用通知,后者可能会快一点,但总是要测试以确保。
此外,任何指向现有的指针 涵盖这一点的文章将是 非常感激。我用Google搜索,但是 很惊讶地发现一点点深入 讨论这些问题(尽管如此 也许我没有使用正确的魔法 关键字)。
我认为这更是因为NSNotificationCenter一般来说非常容易使用。如果您担心某些情况,请不要害怕编写快速测试应用程序!
答案 1 :(得分:10)