`

NSNotification、delegate和KVO的区别

KVO 
阅读更多

KVO vs NSNotification vs protocol/delegate:
1. Use a delegate if you want to talk to only one object. For example, a tableView has a delegate - only one object should be responsible for dealing with it.
2. Use notifications if you want to tell everyone that something has happened. For example in low memory situations a notification is sent telling your app that there has been a memory warning. Because lots of objects in your app might want to lower their memory usage it's a notification.
3. I don't think KVO is a good idea at all and try not to use it but, if you want to find out if a property has changed you can listen for changes. 

 

1. 效率肯定是delegate比NSNotification高。

delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一 步。相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如 NSWindowDidResizeNotification,那么NSWindow对象放出这个notification后就什么都不管了也不会等待接 受者的反应。

2、KVO和NSNotification的区别

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

1)KVO的使用:

被观察者发出  addObserver:forKeyPath:options:context:  方法来添加观察者。

然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:

因此观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应。

这 些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很 简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。
2)NSNotification的使用
这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。
首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。
然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。
NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。
分享到:
评论

相关推荐

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS开发中,KVC(Key-Value Coding)、KVO(Key-Value Observing)、NSNotification和Delegate是四种常见的数据通信和状态监听技术。下面将详细解释这些概念及其区别。 1. KVC(Key-Value Coding) KVC是Objective-...

    IOS中KVC和KVO用法demo

    在iOS开发中,Key Value Coding (KVC) 和 Key Value Observing (KVO) 是两种强大的数据处理技术,它们提供了一种间接访问对象属性的方法,以及动态监控属性变化的能力。 KVC,全称Key Value Coding,是Objective-C...

    KVO-32.xcodeproj

    - **NSNotification**:更通用,可以观察任何事件,但不如KVO直接和精确。 - **Blocks/Closures**:更现代,代码更简洁,但可能导致循环引用。 - **Delegate**:面向协议,适合一对一通信,不适合多对一监听。 在...

    研发中心Java前端安卓iOS经典面试问题及面试流程

    iOS面试会测试Objective-C/Swift的特性,内存管理,KVO、NSNotification、delegate和block的使用,以及性能优化和避免内存泄漏的方法。 总体而言,面试旨在全面评估应聘者的综合能力和专业技能,确保他们能够适应并...

    OC底层面试题1

    本文将深入讲解几个关键知识点,包括通知(NSNotification)、属性关键字、分类、扩展以及代理(Delegate)和KVO(Key-value observing)。 首先,我们来看通知(NSNotification)。通知是一种基于观察者模式的机制...

    ios-按钮排布.zip

    8. **Notification 和 KVO**:如果需要在其他地方响应地区选择或删除事件,可以使用NSNotification来发布和接收通知,或者使用Key-Value Observing(KVO)来监听特定对象的属性变化。 综上所述,设计和实现“ios-...

    IOS应用源码——从下往下拉进行列表内容动态加载.zip

    4. **KVO(Key-Value Observing)** 或 **NSNotification**: 如果没有使用Core Data,开发者可能使用KVO来监听数据源的变化,或者通过NSNotification中心来触发加载更多数据的事件。 5. **ScrollView Delegate ...

    ios-iOS八种传值.zip

    2. **协议(Protocol)**:定义一个协议,让多个类遵循,然后通过代理(Delegate)模式实现数据传递。委托对象可以通过协议方法接收并处理数据。 3. **Block(闭包)**:Block是Objective-C中的匿名函数,可以捕获...

    ios 代理方法

    在iOS开发中,代理方法(Delegate Method)是Objective-C和Swift中的一种常见设计模式,用于对象间通信。它允许一个对象(通常称为“代理”)响应另一个对象(“委托者”)的事件或请求。代理模式是iOS应用中实现回...

    XYQuick:快速开发框架。 包含:弱计时器,按钮块,弱KVO,弱通知,内存缓存文件缓存,UI信号,类别

    它包含Core , Event , UI三层,封装了数据持久化,数据缓存(文件缓存,内存缓存),kvo,Notification,delegate,动画,图片处理,自定义了ViewController生命周期。 本库采用ARC XY快速 核 XYTimer //定时器类 ...

    ios-传值集合.zip

    传值集合.zip"压缩包,我们可以详细探讨一下其中提及的七大传值方式:代理(Delegate)、单例(Singleton)、属性(Property)、通知(Notification)、Block、Key-Value Coding(KVC)和Key-Value Observing(KVO)...

    IOS 视图间代理传值

    这种代理传值方式在某些情况下优于其他数据传递方法,如使用`NSNotification`或`KVO`。它更加灵活,可以实现一对多的关系,同时提供了明确的调用路径,让代码逻辑更清晰。但需要注意的是,过多的代理关系可能会使...

    UI界面之间的值传递-思路2-微变化

    本文将详细讨论几种常见的数据传递方法,包括Key-Value Observing(KVO)、Protocol、Delegate、NSNotification以及SignalLeton,以帮助开发者更好地理解和运用这些技术。 首先,Key-Value Observing(KVO)是...

    Objective-C培训PPT,非常详细全面,没有logo,有配套代码

    这部分会讲解如何使用类目进行代码组织和功能扩展,以及协议在设计模式如代理(Delegate)和数据源(DataSource)中的应用。 5. **内存管理.ppt**: Objective-C使用引用计数进行内存管理,这部分可能涵盖`retain`...

    ocdemo.zip

    8. KVC与KVO:Key-Value Coding(KVC)和Key-Value Observing(KVO)是OC中用于动态访问和监听对象属性的机制,常用于数据绑定和观察者模式。 9. NSNotification:NSNotification中心允许对象发布和接收通知,提供...

    COCOA设计模式 完整版 中文版

    4. **观察者模式**:NSNotification和KVO(Key-Value Observing)是COCOA中的观察者模式实现,让一个对象能够监听并响应其他对象的状态变化。 5. **模型-视图-控制器(MVC)模式**:COCOA的核心架构,将数据处理...

    100家企业iOS面试题(下)

    #### 题目120:NSNotification与delegate的区别是什么? - **知识点**: - ** NSNotification**:NSNotification是基于观察者模式的通知中心机制,允许对象之间进行松散耦合的通信。 - ** delegate**:代理模式...

    详解Cocoa中监听观察和通知五种方法

    在Cocoa框架中,监听和观察机制是实现对象间通信的重要方式,主要涉及五种方法。这些方法使得对象能够响应其他对象的状态变化,保持应用程序的动态性和灵活性。下面将详细介绍这五种方法。 1. 手动广播者和监听者:...

Global site tag (gtag.js) - Google Analytics