一、通知
1. 监听通知
调用addObserver:selector:name:object:
方法来监听通知。
参数的含义:
-
observer
:通知监听者 -
selector
:当监听到通知时调用的方法 -
name
:通知的名称。如果填nil,则监听任意名称的通知 -
object
:通知的发布者。如果填nil,则监听任意发布者发布的通知
2. 创建通知对象
调用NSNotification类的类方法notificationWithName: object: userInfo:
来创建通知
参数的含义:
-
name
:通知名称 -
object
:通知发布者 -
userInfo:
通知中附带的信息,是一个字典类型的对象
3.发布通知
- 调用
postNotification:
方法来发布一个通知,接受的参数是一个NSNotification对象
或: - 调用
postNotificationName: object: userInfo:
方法来直接创建并发布一个通知
4.移除通知:
- 调用
removeObserver:
方法来移除一个对象监听的所有通知
或: - 调用
removeObserver:name:object:
方法来移除指定通知
二、KVO
- 监听变化
调用addObserver:forKeyPath:options:context:
方法增加监听 - 监听到变化后
实现observerValueForKeyPath:ofObject:change:context
方法处理键值变化 - 移除监听
调用removeObserver:forKeyPath:
方法移除监听 - KVO的缺点:
- 任何地方导致键值的改变都会被监听到,无法区分改变的原因
- 用到了KVO的类,系统会自动生成一个子类
三、代理
- 定义一份协议
- 通常以类名+Delegate作为协议名称
- 协议中方法的通常为@optional
- 协议中最好把类中的对象本身作为参数传递
声明一个代理属性
格式:@property(weak, nonatomic) id<协议名> delegate;
设置代理。代理类需要遵循协议
在类的实现中调用代理方法,在调用时最好先通过
responseToSelector:
方法进行内省,避免运行时错误在代理类中实现代理协议的方法
</br>
总结:
三种方式的区别
通知:一个对象可以发送通知给多个对象,一个对象也可以监听多个对象发生的通知;
KVO:只能监听属性的改变
代理:一个对象只能设置一个代理,一个对象能成为多个对象的代理。
取舍与选择:
代理比通知更规范(通知中的通知名称需要知道内部实现才能进行使用),能使用代理时最好使用代理。
如果只需要监听属性的改变,可以使用KVO