两个对象之间如何通信

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

  • 直接方法调用
  • 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,观察者模式,适用于侦听另一对象的属性的变化。

你可能感兴趣的:(两个对象之间如何通信)