KVC和KVO的一点总结

Key-value coding也即通过key来get和set对象的value,之所以这么做而不直接使用对象自带的getter和setter为了使用key-value observing功能。

那么什么是key-value observing呢?简而言之,key-value observing是一种消息通知的机制,和NSNotification的功能相似。使用NSNotification时,通过post来发消息,通过addObserver来观察消息。而key-value observing则更加动态地实现一个对象的改变,可以通知自己或另一个对象,进而采取相应的措施。

那么如何实现key-value observing呢?如之前所言,得先将对象的value和字符串的key绑定起来,这样做好像构造一个字典,通过key来访问value。NSKeyValueCoding协议中的方法实现了这种绑定。

- (void)setValue:(id)value
          forKey:(NSString *)key 

由于NSObject实现了该方法,所以我们可以直接使用。绑定好key和value后,我们希望有某个对象B来监听对象A的变化。为了说明的方便,我以对象A为罪犯,对象B为警察来比喻。警察希望时时刻刻监听罪犯对象的行为变化。比如说警察通过罪犯的信用卡记录来判断罪犯是否犯罪,那么警察必须将自己和罪犯的信用卡记录进行绑定(注意警察只关注罪犯的部分属性,警察对罪犯每天吃什么并不关心,所以不需要绑定罪犯对象本身)。对于罪犯而言,警察是observer,监听属性是creditRecord。

- (void)addObserver:(NSObject *)observer
         forKeyPath:(NSString *)keyPath
            options:(NSKeyValueObservingOptions)options
            context:(void *)context

具体到我们的例子就是下面的方法。

[criminal addObserver:policeman
            forKeyPath:@"creditRecord"
            options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
            context:nil ]

这里的keyPath就看得出之前为什么我们要做key-value的绑定工作了。那么为什么叫keyPath而不叫key呢?keyPath可以是一条完整的路径,假如警察想观察的不是罪犯的creditRecord,而是罪犯女友的creditRecord,那么对应的keyPath变为@"girlFriend.creditRecord"。留意下options, 它可以让警察选择观察记录下罪犯变化前后的值。

此时警察可以说已经”盯上“上了罪犯,接下来要处理的就是一旦罪犯的creditRecord出现变化,警察应该做出反应。我们可以在警察类中增加响应方法。

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context

具体到我们的例子是下面的方法。

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
      if ([keyPath isEqualToString:@"creditRecord"]) {
           NSInteger old = [change objectForKey:NSKeyValueChangeOldKey];
           NSInteger new = [change objectForKey:NSKeyValueChangeNewKey];
           NSLog("@The creditRecord has changed from %ld to %ld ", (long)old, (long)new );

    }
}

到此基本就结束了key-value observing的介绍~

时间: 2024-09-30 20:35:51

KVC和KVO的一点总结的相关文章

KVC 和 KVO 的一点理解

KVC 用 KVC 实现高阶消息传递 valueForKey: 有很多有用的特例,比如说 NSArray 和 NSSet 这样的容器类都覆盖了这个方法.valueForKey: 被传递给容器中得每一个对象,而不是对容器本身进行操作.结果会被添加进返回的容器中.这样,开发者能很方便的用一个容器创建另一个容器对象,比如像这样: NSArray *array = @[@"foo",@"bar",@"baz"]; NSArray *capitals =

我所认为的KVC和KVO

引子:    ?   为什么要写这个,只是突然一个念头闪现,说一下本人目前理解.KVC:    ?   Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制.但是关就这一点来说,这么久以来确实没怎么体会到用这个的好处,我没有明显的理由用setValut:forKey 而不是直接用一个属性.当然,KVC是KVO实现的基础,这个基础究竟是什么?下来道来KVO:       ?KVO其实就是一种观察者模式的实现.两个角色:被观察者A和观察者B.假如B观察A的某一个属性,那

KVC 和 KVO

Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制.在这篇文章里,我们将接触一些如何利用这些特性的例子. 观察 model 对象的变化 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化:当用户和控制器交互的时候,模型也应该做出相应

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

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

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

11. KVC And KVO

1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制.KVO全称是Key-value observing,翻译成键值观察.提供了一种当其它对象属性被修改的时候能通知当前对象的机制.再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯. 2. KVC And

iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 Key Value Coding(键值编码),是OC 语言的一个特性,使用KVC,可以对对象的属性进行动态读写. KVC的操作方法由 NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作.常用的KVC操作方法有: (1)设置属性

KVC、KVO实现过程

1.KVC的实现过程 以 [object setValue:@"134567" forKey:@"uid"];为例子,来探究KVC的实现过程 第一步:搜索1.首先搜索setKey:方法.(key指成员变量名, 首字母大写)2.上面的setter方法没找到, 如果类方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的顺序搜索成员名.(NSKeyValueCodingCatogery中实

KVC 与 KVO 理解-b

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 a