对象之间的通信方式主要有以下几种:
- 直接方法调用
- 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,观察者模式,适用于侦听另一对象的属性的变化。