博客
关于我
NSNotification、delegate和KVO的区别
阅读量:701 次
发布时间: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/

你可能感兴趣的文章
Python:简介
查看>>
python:input
查看>>
python:字符串
查看>>
cobaltstrike生成一个原生c,然后利用xor加密解密执行
查看>>
HTML中如何给HTML元素添加事件
查看>>
IDEA springMVC不报错出现访问404问题
查看>>
Redis概述和基础
查看>>
SSH整合的404错误
查看>>
wpf 使用Font Awesome
查看>>
阿里云Windows服务器+PHPStudy+apache 如何部署SSL证书
查看>>
c++11:std::declval、decltype
查看>>
Windows10:远程桌面连接报错“出现身份验证错误。要求的函数不受支持”
查看>>
Golang: ,ok模式
查看>>
C++ 错误:“xxx” does not name a type
查看>>
找不到自己Win10的Linux子系统的根目录?在这里哟!
查看>>
redis的发布和订阅
查看>>
lettcode 221. 最大正方形
查看>>
112. 路径总和(Javascript)
查看>>
G1 如何做到可预测的停顿和G1 垃圾收集器入门
查看>>
Tomcat启动报404(eclipse)
查看>>