NSNotification使用姿势
基本使用
发送通知:
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
- aName:通知名称
- anObject:发送者(sender)
- aUserInfo:关于这个通知的相关信息
接收通知(注册观察者):
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
- observer:观察者
- aSelector:观察者的回调方法
- aName:指定通知名称,为nil则接收任意通知
- anObject:指定发送者(sender),为nil则可以接收任意发送者的通知
- 观察者只能收到注册以后sender发出的通知。
- 如果app内存在多个同名的Notification,观察者可以通过object参数指定发送者。
- 观察者可以多次addObserver同一个通知,这样会导致selector被多次调用。
- 同一个NSNotification可以被多次post
移除观察者:
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;
iOS8及以前,NSNotificationCenter持有的是观察者的unsafe_unretained指针(可能是为了兼容老版本),这样,在观察者回收的时候未removeOberser,而后再进行post操作,则会向一段被回收的区域发送消息,所以出现野指针crash。而iOS9以后,unsafe_unretained改成了weak指针,即使dealloc的时候未removeOberser,再进行post操作,则会向nil发送消息,所以没有任何问题。
注意事项
- 每当发送一个广播,NSNotificationCenter会遍历所有观察者,对于频繁发送的通知,应该创建一个专门的NSNotification