KVO && KVC

KVO:

  • key-value observing

    • 当指定的对象的属性被修改后,则对象就会接受到通知。
    • 简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者。
    • 使用步骤:
      • 1.注册,指定被观察者的属性(由被观察者主动添加观察自己的观察者)
      • 2.实现回调方法
      • 3.移除观察
      • 使用范例:
        • @interface StockData : NSObject {
        • NSString * stockName;
        • float price;
        • }
        • @end
        • @implementation StockData
        • @end
        • - (void)viewDidLoad {
        • [super viewDidLoad];
        • stockForKVO = [[StockData alloc] init];
        • [stockForKVO setValue:@"searph" forKey:@"stockName"];
        • [stockForKVO setValue:@"10.0" forKey:@"price"];
        • //往StockDat对象上添加观察者
        • [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
        • myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
        • myLabel.textColor = [UIColor redColor];
        • myLabel.text = [stockForKVO valueForKey:@"price"];
        • [self.view addSubview:myLabel];
        • UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        • b.frame = CGRectMake(0, 0, 100, 30);
        • [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
        • [self.view addSubview:b];
        • }
        • -(void) buttonAction {
        • [stockForKVO setValue:@"20.0" forKey:@"price"];
        • }
        • //作为一个KVO的观察者需要实现回调
        • -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        • if([keyPath isEqualToString:@"price"]) {
        • myLabel.text = [stockForKVO valueForKey:@"price"];
        • }
        • }
        • //最后需要移动观察者
        • - (void)dealloc {
        • [stockForKVO removeObserver:self forKeyPath:@"price"];
        • }

KVC:

  • KeyValueCoding的简称

    • 一种使用字符串标识符,间接访问对象属性的机制,而不是通过调用Setter、Getter方法访问。
    • 即使对象中的成员变量不是属性,也可以通过KVC读写成员变量值
    • 使用方法:
    • 关键方法:
      • NSKeyValueCodingprotocol
      • 获取值:
        • valueForKey:(NSString *)属性的名字
        • valueForKeyPath:(NSString *)传入属性的路径,xx.xx形式。
        • valueForUndefinedKey
        • 默认实现是抛出异常,可以重写这个函数做错误处理。
      • 修改值
        • setValue:forKey:
        • setValue:forKeyPath:
        • setValue:forUndefinedKey:
        • setNilValueForKey:
        • 当对非类对象属性设置nil时,调用,默认抛出异常。
      • 一对多关系成员的情况
        • mutableArrayValueForKey:
        • 有序一对多关系成员 NSArray
        • mutableSetValueForKey:
        • 无序一对多关系成员 NSSet
        • 示范例子:
          • Person类
          • @implementation Person
          • @synthesize name,age;//属性name 将被监视
          • -(void) changeName{
          • [email protected]"changeName directly";
          • }
          • @end
          • PersonMonitor类 监视了name属性
          • @implementation PersonMonitor
          • - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
          • if ([keyPath isEqual:@"name"]) {
          • NSLog(@"change happen, old:%@ new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);
          • }
          • }
          • @end
          • //测试代码
          • //初始化被监视对象
          • Person *p =[[Person alloc] init];
          • //监视对象
          • PersonMonitor *pm= [[PersonMonitor alloc]init];
          • //KVO
          • [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];
          • //测试前的数据
          • NSLog(@"p.name is %@",p.name);
          • //KVC
          • //通过setvalue 的方法,PersonMonitor的监视将被调用
          • [p setValue:@"name kvc" forKey:@"name"];
          • //查看设置后的值
          • NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);
          • //效果和通过setValue 是一致的
          • [email protected]"name change by .name=";
          • //通过person自己的函数来更改name
          • [p changeName];
          • /*
          • 结果输出
          • 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name
          • 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name new:name kvc
          • 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc
          • 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc new:name change by .name=
          • 最后一次修改是直接修改 所以没法产生通知
          • */
时间: 2024-12-26 12:31:29

KVO && KVC的相关文章

iOS:KVO/KVC 的概述与使用

KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单. 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其

iOS开发——KVO/KVC&OC与Swift篇详解

Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是1种间接访问对象的机制 key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型 KVC主要就是两个方法 (1)通过key设置对应的属性 (2)通过key获得对应的属性 举例 class TestForKVC:NSObject{ var hwcCSDN = "hello world" } var instance = TestForKVC() va

KVO/KVC总结

KVO/KVC总结 下面是根据网上文章的总结,方便查看. 在网上看别人的文章,了解KVC.KVO,有个kvo-kvc的例子,就是改变数组的内容(插入和删除),同步改变tableview中的内容.运行了代码之后,想添加修改数组时改变tableview内容,但是一直不能调用观察函数,后来又查了点资料,原来,数组的kvc是都是有固定格式的函数名字.把改后的工程放到资源里面了.供大家下载.下面是拷贝过来的资料. 一.KVC和KVO的概念 1> KVC:NSKeyValueCoding的简称,是一种可以直

ios 之kvo&kvc的使用

转载:http://www.cnblogs.com/kenshincui/p/3871178.html 概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于Obj

kvo&kvc

Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor, 如我们有个property叫做foo, 我们可以foo直接访问它,同样我们也可以用KVC来完成[Object valueForKey:@“foo”], 有同学就会问了, 这样做有什么好处呢?主要的好处就是来减少我们的代码量. 下面我们来看看几个例子,就明白了KVO的用法和好处了,假设这

【转】 iOS KVO KVC

原文: http://www.cocoachina.com/industry/20140224/7866.html Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor, 如我们有个property叫做foo, 我们可以foo直接访问它,同样我们也 “” 阅读器 iOSKVOKVC 转自:Regrecall blogger Key Valu

KVO/KVC 实现机理分析

原文:http://blog.csdn.net/dqjyong/article/details/7672865 Objective-C里面的Key-Value Observing (KVO)机制,非常不错,可以很好的减少浇水代码.关于KVO的学习,可以参考文章:<Key-Value Observing快速入门>:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp KVO概念:      KVO是co

细说KVO &amp; KVC &amp; NSNotificationCenter那些事

在iOS开发过程中,我们经常会听到或者用到KVO,KVC,NSNotificationCenter等,但是很多时候,我们可能没有那么了解,下面让我们来详细了解下他们的概念.用法以及他们之间的关系吧- 本篇博客共分以下几个模块来介绍: 什么是KVC? 什么是KVO? KVC与KVO的关系 KVC Collection Operators 什么是NSNotificationCenter? NSNotificationCenter与KVO的比较 NSNotificationCenter与Delegat

kvo kvc 知识点在IOS Developer Library中的位置

进入到Topics的Data Managment版块,搜索 key-value即可出来 KVC Data Management ->key-value Coding Programming Guide (Foundation Framework) KVO Data Management ->key-value Observing Programming Guide (Foundation Framework)