iOS中的消息传递

一、通知

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

  1. 监听变化
    调用 addObserver:forKeyPath:options:context:方法增加监听
  2. 监听到变化后
    实现 observerValueForKeyPath:ofObject:change:context方法处理键值变化
  3. 移除监听
    调用removeObserver:forKeyPath:方法移除监听
  4. KVO的缺点:
  • 任何地方导致键值的改变都会被监听到,无法区分改变的原因
  • 用到了KVO的类,系统会自动生成一个子类

三、代理

  1. 定义一份协议
  • 通常以类名+Delegate作为协议名称
  • 协议中方法的通常为@optional
  • 协议中最好把类中的对象本身作为参数传递
  1. 声明一个代理属性
    格式:@property(weak, nonatomic) id<协议名> delegate;

  2. 设置代理。代理类需要遵循协议

  3. 在类的实现中调用代理方法,在调用时最好先通过responseToSelector:方法进行内省,避免运行时错误

  4. 在代理类中实现代理协议的方法

</br>

总结:

三种方式的区别

通知:一个对象可以发送通知给多个对象,一个对象也可以监听多个对象发生的通知;
KVO:只能监听属性的改变
代理:一个对象只能设置一个代理,一个对象能成为多个对象的代理。

取舍与选择:

代理比通知更规范(通知中的通知名称需要知道内部实现才能进行使用),能使用代理时最好使用代理。
如果只需要监听属性的改变,可以使用KVO

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

推荐阅读更多精彩内容