两个对象之间如何通信

对象之间的通信方式主要有以下几种:

  • 直接方法调用
  • Target-Action
  • Delegate
  • 回调(block)
  • KVO
  • 通知

一般情况下,我们可以根据以下两点来确定使用哪种方式:

  • 通信对象是一对一的还是一对多的
  • 对象之间的耦合度,是强耦合还是松耦合
通知由于其广播性及松耦合性,非常适合于大的范围内对象之间的通信(模块与模块,或一些框架层级)

对于使用NSNotificationCenter,最后总结一些小建议:

  • 在需要的地方使用通知。
  • 注册的观察者在不使用时一定要记得移除,即添加和移除要配对出现。
  • 尽可能迟地去注册一个观察者,并尽可能早将其移除,这样可以改善程序的性能。因为,每post一个通知,都会是遍历通知中心的分发表,确保通知发给每一个观察者。
  • 记住通知的发送和处理是在同一个线程中。
  • 使用-addObserverForName:object:queue:usingBlock:务必处理好内存问题,避免出现循环引用。
  • NSNotificationCenter是线程安全的,但并不意味着在多线程环境中不需要关注线程安全问题。不恰当的使用仍然会引发线程问题。

===================================

通知和代理的选择
共同点 利用通知和代理都能完成对象之间的通信 (比如A对象告诉D对象发生了什么事情, A对象传递数据给D对象)
不同点 代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情) 通知 : 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

======================================

在功能上说,delegate、Notification以及KVO的功能类似,都是作用于OC中对象的消息通信。但三者的使用场景是不同的。简单的说Delegate是一种回掉函数,更多的用在一对一的场合,可参考 iphone:delegate机制 ;Notification 用得较少,使用Notification Center,类似广播方式,所以更适合一对多的通信;KVO,key-Value-Observing,观察者模式,适用于侦听另一对象的属性的变化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,205评论 30 471
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,757评论 0 4
  • 设计模式 1.delegate和notification什么区别,什么情况使用? 2.描述一下KVO和KVC。 K...
    丶逐渐阅读 1,977评论 3 2
  • 转载自南峰子的技术博客 一个NSNotificationCenter对象(通知中心)提供了在程序中广播消息的机制,...
    我消失1314阅读 909评论 0 2
  • getElementsByTagName() / getElementsByClassName() 返回的不是a...
    maomizone阅读 497评论 0 0