博客
关于我
NSNotification、delegate和KVO的区别
阅读量:699 次
发布时间:2019-03-21

本文共 1441 字,大约阅读时间需要 4 分钟。

NSNotification、delegate和KVO都是用于在Objective-C中实现对象间的通信,但它们有着不同的机制和应用场景。以下是对这三种技术的深入分析,帮助您更好地理解它们的区别和应用。

1. delegate(代理)

特点:

  • 通讯方式:是一对一通信,即A类将消息直接传递给指定的B类。
  • 机制:A类将自己的委托设置为B类(A.delegate = self),当A类需要执行某项任务或发生某种事件时,会自动调用B类的相应代理方法。
  • 优点
    • 直接性:不需要依赖中介类,如NSNotificationCenter。
    • 高效率:调用直接且快速,常用于特定的事件处理。
    • 特定性:方法的调用更具体和强类型化,例如窗口关闭时会调用windowShouldClose:方法并期望返回一个Bool值。
  • 常见场景
    • UI事件处理,如窗口关闭、重叠变化等。
    • 核心业务逻辑的通知,如数据有效性检查。

特点总结:

  • 适用场景:明确关联且互相依赖的对象间通信。
  • 优点:高效、直接且强类型化。

2. NSNotification(通知)

特点:

  • 通讯方式:支持一对多通信,即A类将通知发送给注册的多个观察者。
  • 机制:通过NotificationCenter发送,需要观察者主动注册(如addObserver:selector:name:object:方法)来监听特定通知名称。
  • 优点
    • 灵活性:可以实现多对多的通知机制,适合多个组件共享状态变化。
    • 中介性:通知由NotificationCenter统一发送,不需要直接依赖发送者或接收者。
  • 优点
    • 广播能力:通知可以被多个组件接收,不受发送限制。
    • 可扩展性:适合应用程序中需要多个组件响应同一事件。

特点总结:

  • 适用场景:无关对象间的状态变化通知。
  • 优点:支持多对多的通信机制,适合大型或复杂的应用架构。

3. KVO(Key-Value Observing,键值观察)

特点:

  • 通讯方式:依赖对象属性的变化,动态地触发观察者的回调方法。
  • 机制:被观察者需要公开属性的属性键路径,被观察者通过addObserver:forKeyPath:options:context:方法注册观察者。
  • 优点
    • 动态性:不需要直接修改被观察者的代码,代码耦合度低。
    • 灵活性:可以监测多个属性变化,适合复杂场景。
    • 可扩展性:便于灵活地扩展和调试。

特点总结:

  • 适用场景:监测属性的动态变化,响应属性状态的变化,如UI自动更新。
  • 优点:代码耦合度低,支持动态计算和变换。

4. 区别总结

  • 目标对象
    • Delegate和NSNotification都涉及双方的合作。
    • KVO则是单方面的行为,由被观察者发起通知。
  • 通信范围
    • Delegate和NSNotification是双方合作,而KVO是单方面通知。
  • 结果处理
    • Delegate和NSNotification通常不涉及结果处理,而KVO可以通过改变属性值触发反馈。

5. 结论

在选择通信机制时,需根据具体需求综合考虑:

  • 使用Delegate:当两个类有直接依赖关系且需要互相通知对方时,使其简洁而高效。
  • 使用NSNotification:当需要支持多对多的状态变化通知,且需要一个统一的中心机制。
  • 使用KVO:当需要动态监测属性变化而避免代码耦合,适合方便灵活的场景。

每个机制都有其适用的场景,理解和选择它们的应用方式,是提升代码质量和开发效率的关键。在实际开发中,根据项目需求合理组合使用,以达到最佳效果。

转载地址:http://sfbrz.baihongyu.com/

你可能感兴趣的文章
【毕设-STM32f103寄存器版本】智能防盗系统
查看>>
Vue Itea软件里直接npm run build 报错npm ERR! missing script :build
查看>>
勒索病毒Kraken2.0.7分析
查看>>
MySQL错误1366处理方法
查看>>
Error running Address localhost:1099 is already in use(已解决)
查看>>
pytorch深度学习中每个epoch运行时间的统计代码
查看>>
VxWorks 操作系统学习笔记
查看>>
链表插入和删除算法
查看>>
断言(assert)的用法
查看>>
主机与虚拟机(ubuntu)可以互ping,虚拟机不能上网解决办法
查看>>
驱动程序之_1_字符设备_13_USB设备_1_基本概念
查看>>
wxPython下载安装教程
查看>>
HERest源码解析
查看>>
java 原型模式(大话设计模式)
查看>>
微机原理 6-计算机中常用的数制
查看>>
web访问ejb测试 详解
查看>>
window系统下安装使用curl命令工具
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
神器 Codelf !
查看>>
趣图:会算法和不会算法的区别
查看>>