KVC和KVO简单介绍

KVO

 

APP开发技术QQ群:347072638

一,概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

二,使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

三,实例:

假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

1.定义DataModel,

[cpp] view plaincopy

  1. @interface StockData : NSObject {
  2. NSString * stockName;
  3. float price;
  4. }
  5. @end
  6. @implementation StockData
  7. @end

2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. stockForKVO = [[StockData alloc] init];
  5. [stockForKVO setValue:@"searph" forKey:@"stockName"];
  6. [stockForKVO setValue:@"10.0" forKey:@"price"];
  7. [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
  8. myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
  9. myLabel.textColor = [UIColor redColor];
  10. myLabel.text = [stockForKVO valueForKey:@"price"];
  11. [self.view addSubview:myLabel];
  12. UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  13. b.frame = CGRectMake(0, 0, 100, 30);
  14. [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
  15. [self.view addSubview:b];
  16. }

3.当点击button的时候,调用buttonAction方法,修改对象的属性

[cpp] view plaincopy

  1. -(void) buttonAction
  2. {
  3. [stockForKVO setValue:@"20.0" forKey:@"price"];
  4. }

4. 实现回调方法

[cpp] view plaincopy

  1. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  2. {
  3. if([keyPath isEqualToString:@"price"])
  4. {
  5. myLabel.text = [stockForKVO valueForKey:@"price"];
  6. }
  7. }

5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

[cpp] view plaincopy

  1. - (void)dealloc
  2. {
  3. [super dealloc];
  4. [stockForKVO removeObserver:self forKeyPath:@"price"];
  5. [stockForKVO release];
  6. }

四,小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

KVC

一,概述

KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。

当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。

二,使用方法

关键方法定义在:NSKeyValueCodingprotocol

KVC支持类对象和内建基本数据类型。

获取值

valueForKey:,传入NSString属性的名字。

valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

 修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。

一对多关系成员的情况

mutableArrayValueForKey:有序一对多关系成员  NSArray

mutableSetValueForKey:无序一对多关系成员  NSSet

三,实例:

1.    1 .Person类

2.    @implementation Person

3.    @synthesize name,age;//属性name 将被监视

4.    -(void) changeName

5.    {

6.        [email protected]"changeName directly";

7.    }

8.    @end

9.

10.

11. 2.PersonMonitor类  监视了name属性

12. @implementation PersonMonitor

13.

14. - (void)observeValueForKeyPath:(NSString *)keyPath

15.                       ofObject:(id)object

16.                         change:(NSDictionary *)change

17.                        context:(void *)context

18. {

19.     if ([keyPath isEqual:@"name"])

20.     {

21.         NSLog(@"change happen, old:%@   new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);

22.     }

23. }

24. @end

25.

26.

27. 3测试代码

28.

29.    //初始化被监视对象

30.     Person *p =[[Person alloc] init];

31.    //监视对象

32.    PersonMonitor *pm= [[PersonMonitor alloc]init];

33.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];

34.

35. //测试前的数据

36.     NSLog(@"p.name is %@",p.name);

37.

38. //通过setvalue 的方法,PersonMonitor的监视将被调用

39.   [p setValue:@"name kvc" forKey:@"name"];

40.

41. //查看设置后的值

42.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);

43.

44. //效果和通过setValue 是一致的

45. [email protected]"name change by .name=";

46.

47.  //通过person自己的函数来更改name

48.      [p changeName];

49.

50.  结果是

51. 输出

52. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name

53. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc

54. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc

55. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name=

56. 最后一次修改是直接修改  所以没法产生通知

四,小结

KVO/KVC这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

时间: 2024-11-05 11:03:39

KVC和KVO简单介绍的相关文章

KVC 和 KVO 简单总结

KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实质是,是使用 valueForKey来代替 getter 方法, setValueForKey 来代替 setter 方法. KVC 常用的方法: - (id)ValueForKey:   通过 key 值读取对象的属性 -(id)setValue: forKey: 通过 key 的值来使用属性 -

iOS开发UI篇—KVC简单介绍

一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #import <Foundation/Fo

ios开发UI基础—Kvc简单介绍

一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #import <Foundation/Fo

文顶顶 iOS开发UI篇—Kvc简单介绍

ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #impo

Kvc简单介绍

Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #import <Found

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

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

iOS开发中KVC、KVO简介

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

iOS基础 KVC和KVO

疯狂IOS讲义这本书之前一直一直觉得没什么用,看了做不出像样的程序出来,但是经过几天的学习发现,没有一定的ios基础,做的程序永远都是在模仿他人的程序,把他人的代码复制 粘贴...为什么能够实现?原理 是什么?不懂...所以 必须懂原理,为什么? 接下来就今天所学习的内容做一个小结: 首先介绍一下KVO和KVC,一个是键值编码一个是键值监听,我第一次听这个也是很困惑,这是个神马意思?键值是啥?监听 还懂一点 ... 我们都知道之前我们都是通过setter和getter来设置和修改对象的属性,KV

KVC 与 KVO

IOS开发系列--Objective-C之KVC.KVO 2014-07-27 11:29 by KenshinCui, 18479 阅读, 9 评论, 收藏, 编辑 概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方