
NSNotification、delegate和KVO的区别
发布日期:2021-05-24 08:24:26
浏览次数:10
分类:精选文章
本文共 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:当需要动态监测属性变化而避免代码耦合,适合方便灵活的场景。
每个机制都有其适用的场景,理解和选择它们的应用方式,是提升代码质量和开发效率的关键。在实际开发中,根据项目需求合理组合使用,以达到最佳效果。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月24日 11时33分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Springboot 初學習
2019-03-17
如何用华为位置服务实现搜索位置返回父子节点信息
2019-03-17
2020年云南省专升本 - 「计算机」专业各院校招生计划
2019-03-17
同一个实例注册到两个eureka上面
2019-03-17
【数据库】实验二~六
2019-03-17
uni-app的请求数据的封装
2019-03-17
C++容器笔记
2019-03-17
Android 四大组件、五大存储、六大布局总结
2019-03-17
【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW
2019-03-17
打工族有房有车,原来是这么实现的
2019-03-17
算法 顺序查找/折半查找/冒泡排序/选择排序(待改)
2019-03-17
Rancher从入门到精通-2.0 配置gitlab代码库 404页面 原因有点扯
2019-03-17
ProgresSql 连接 ssl off 错误
2019-03-17
浏览器打开winscp 系统错误。代码:5。 拒绝访问。
2019-03-17
Oracle Listener动态注册与静态注册(转载)
2019-03-17
Kubernetes 无法查询到并且无法删除pod实例的排查过程
2019-03-17
android中button修改不了背景颜色
2019-03-17
uniapp自定义弹窗组件|仿微信android/ios弹窗效果
2019-03-17