NSNotification 你不知道的使用技巧

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值