美文网首页
iOS中的消息传递

iOS中的消息传递

作者: Coulson_Wang | 来源:发表于2017-06-08 14:59 被阅读0次

一、通知

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

相关文章

  • iOS模式之二:代理模式

    iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式。 通知:在iOS中由通知...

  • iOS中的消息传递

    一、通知 1. 监听通知 调用addObserver:selector:name:object:方法来监听通知。...

  • iOS开发需要掌握的技能篇

    基础知识储备1. iOS的消息传递方式-1.通知2.iOS的消息传递方式-2.代理3.iOS的消息传递方式-3.B...

  • iOS中消息传递方式

    通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式。 代理:是一种通用的设计模式,iOS...

  • 几种消息传递机制的比较

    本文主要借鉴了 objc上的文章 消息传递机制 iOS中,消息传递机制主要有 5种 KVO Notificatio...

  • 015-iOS 中的多种消息传递机制

    iOS 中的消息传递方法主要有 KVO delegation NSNotification block targe...

  • iOS开发基础:消息传递机制的不同与缺陷

    iOS中的消息传递机制有以下几种: 代理(Delegation) 通知(NSNotification) BLOCK...

  • 消息传递机制的选择

    消息传递机制 分类 在一个应用中不同的对象之间需要通过相互传递消息的方式结合起来共同完成任务。iOS 中主要的消息...

  • iOS 消息传递

    在Objective-C 中,对象调用方法,这是很常见的事情。也许是灯下黑,就因为它很常见,所以我以前都没有深入地...

  • iOS消息传递

    在iOS开发中经常会遇到unrecognized selector sent to instance 0x1001...

网友评论

      本文标题:iOS中的消息传递

      本文链接:https://www.haomeiwen.com/subject/vqgafxtx.html