通知中心是如何维护观察者对象的。
可以明确的是,添加观察者时,通知中心没有对观察者做retain
操作,即不会使观察者的引用计数加1。那通知中心维护的是观察者的weak
引用呢还是unsafe_unretained
引用呢?
个人认为可能是unsafe_unretained
的引用,因为我们知道如果是weak
引用,其所指的对象被释放后,这个引用会被置成nil。而实际情况是通知中心还会给这个对象发送消息,并引发一个异常。而如果向nil发送一个消息是不会导致异常的。
【非常感谢 @lv-pw,上面这个问题在《斯坦福大学公开课:iOS 7应用开发》的第5集的第57分50秒中得到了解答:确实使用的是unsafe_unretained
,老师的解释是,之所以使用unsafe_unretained
,而不使用weak
,是为了兼容老版本的系统。】
Notification的发送与接收处理都是在同一个线程中
如果我们希望一个Notification的post线程与转发线程不是同一个线程则需要重定向
一种重定向的实现思路是自定义一个通知队列(注意,不是NSNotificationQueue对象,而是一个数组),让这个队列去维护那些我们需要重定向的Notification。我们仍然是像平常一样去注册一个通知的观察者,当Notification来了时,先看看post这个Notification的线程是不是我们所期望的线程,如果不是,则将这个Notification存储到我们的队列中,并发送一个信号(signal)到期望的线程中,来告诉这个线程需要处理一个Notification。指定的线程在收到信号后,将Notification从队列中移除,并进行处理。
1、http://southpeak.github.io/2015/03/20/cocoa-foundation-nsnotificationcenter/
2、http://southpeak.github.io/2015/03/14/nsnotification-and-multithreading/