iOS中NSNotificationCenter规则总结

单纯使用

    • (void)postNotification:(NSNotification *)notification;
    • (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;

监听方法和发送方法在同一线程
监听方法执行顺序与监听加入顺序相同
发送方法会阻塞,等待监听方法执行完成

    • (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block

当queue为空时,监听方法和发送方法在同一线程;不为空时,监听方法在指定的Queue上执行
监听方法执行顺序与监听加入顺序相同
发送方法会阻塞,等待监听方法执行完成

可以看出,postNotification:总是会卡住当前线程,待observer执行(如不特殊处理selector也会在postNotification:所在线程执行)结束之后才会继续往下执行。所以是同步的。
忘记remove的问题
这个就不进行测试了,因为我也没有iOS8以及之前的设备。直接写结论了:

若在iOS8或之前版本系统中,对一个对象addObserver:selector:name:object:(假设name为@“111”),但是并没有在dealloc的之前或之中,对其进行remove操作。那么,在发送通知(name为@“111”)的时候,会因为bad_access(野指针)而crash。

若在iOS9及以后,同上操作,不会crash。

iOS8及以前,NSNotificationCenter持有的是观察者的unsafe_unretained指针(可能是为了兼容老版本),这样,在观察者回收的时候未removeOberser,而后再进行post操作,则会向一段被回收的区域发送消息,所以出现野指针crash。而iOS9以后,unsafe_unretained改成了weak指针,即使dealloc的时候未removeOberser,再进行post操作,则会向nil发送消息,所以没有任何问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,453评论 8赞 265
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,524评论 0赞 7
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,580评论 0赞 11
  • 目录: (一)线程与进程之间的区别 (二)为什么需要学习多线程 (三)多线程任务执行方式 (四)多线程执行的...
    KingLionsFrank阅读 885评论 6赞 6
  • 大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B、B2C、C2C、O...
    swiftie10阅读 438评论 0赞 1

友情链接更多精彩内容