1.如果重复添加同一个通知N次,就会接受到N次的响应事件。系统在实现通知的时候,并没有根据通知名称去重。
2.ios9之前,观察者注册时,通知中心并不会对观察者对象做 retain 操作,而是对观察者对象进行unsafe_unretained
引用。当被引用的对象释放的时,不安全引用并不会自动被置为 nil,这就意味着它变成了野指针,而对野指针发送消息会导致程序崩溃。因此,观察者对象在释放之前必须从通知中心移除引用,否则通知中心就会给野指针所引用的对象发送消息,导致程序崩溃。(注:Cocoa 和 Cocoa Touch 中的一些类还没有支持弱引用,所以采用不安全的引用只是为了兼容旧的版本。)
3.对于addObserver:
要分ViewController和普通NSObject两个说起
ViewController:在调用ViewController的dealloc的时候,系统会调用[[NSNotificationCenter defaultCenter]removeObserver:self]
方法,所以如果是在viewDidLoad中使用addObserver添加监听者的话可以省掉移除。
普通NSObject:在iOS9之前,NSObject不会像ViewController一样在dealloc时调用[[NSNotificationCenter defaultCenter]removeObserver:self]
方法。所以必须手动移除。
从 iOS 9 开始通知中心会对观察者进行弱引用,所以不需要在观察者对象释放之前从通知中心移除。但是,通过-[NSNotificationCenter addObserverForName:object:queue:usingBlock]方法注册的观察者依然需要手动的释放,因为通知中心对它们持有的是强引用。
4.通知是同步操作,详见https://blog.csdn.net/u014220518/article/details/70598063
参考:https://www.jianshu.com/p/7925a00ec739
5.如果通知失败了,可能是不在同一线程,可采用下面的代码处理
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(smallLikeAnimation) name:ACKClickLikeBtnNotification object:nil];
});
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:ACKClickLikeBtnNotification object:nil userInfo:nil];
});