KVC、KVO

转载 2015年07月09日 19:29:50

KVC、KVO

1、       键值编码KVC

很多语言如Java、C#等通过反射机制可以读写一个对象的属性,在一些特殊场合,这种方式可以方便管理对象属性。在OC中,我们不必进行任何操作就可以动态的读写属性值,这种方式就是KeyValue Coding,简称为KVC。

若要对象支持KVC操作,需要实现NSKeyValueCoding协议,而NSObject已实现该协议,所以OC中几乎所有的对象都支持KVC操作,该协议提供的方法如下:

l  动态设置

setValue:forKey;简单路径

setValue:forKeyPath;复合路径

l  动态读取

valueForKey:

valueForKeyPath:

案例:

//Account类

@interface Account : NSObject

@property(nonatomic,assign)NSInteger balance;//余额

@end

//Person类

    @class Account;

    @interface Person : NSObject

    @property(nonatomic,copy)  NSString * name;

    @property(nonatomic,strong)Account  * account;

@end

 

int main(int argc,const char * argv[])

{

    @autoreleasepool

    {

        Account * account=[[Accountalloc] init];

        Person  * person=[[Personalloc] init];

       

        //KVC

        [person setValue:@"ssl"forKey:@"name"];

        [person setValue:accountforKey:@"account"];

        [person setValue:@12forKeyPath:@"account.balance"];

       

        NSLog(@"name=%@,balance=%ld",person.name,person.account.balance);

    }

    return 0;

}

KVC使用起来比较简单,不管属性是公有的还是私有的,都可以进行读取和设置,但是它如何查找一个属性进行读取或设置呢?(假设对person的name属性进行读取)

l  首先调用setName方法,如果该方法不存在,则搜索成员变量_name,如果属性不存在,则调用setValue:forUndefinedKey:

l  调用name方法,如果没有则搜索_name成员变量,如果成员变量不存在,则调用valueForUndefinedKey;

2、       键值监听KVO

在很多框架中,都支持双向绑定。如果数据模型发生改变,则通知响应的UI更新。在OC中,原生就支持该机制,叫做KeyValue Observing,简称KVO。KVO其实是一种观察者模式,利用它可以很容易实现视图和数据模型的分离,当数据模型发生改变时,作为监听器的视图组件就会被激发进行响应。在OC中要实现KVO必须实现NSKeyValueObserving协议。由于NSObject已实现该协议,因此OC的几乎所有对象都可以使用KVO。

使用KVO的步骤如下:

1)     注册指定key的监听器,addObserver:forKeyPath:option:context:监听器一般为视图组件,而数据模型为监听对象;

2)     实现回调监听:observeValueForKeyPath:ofObject:change:context:

3)     删除指定key的监听器,removeObserver:forKeyPath;

 下面为Account实例的balance属性注册监听器,当balance属性发生改变时,激发监听器响应。

//Account类

@interface Account : NSObject

@property(nonatomic,assign)NSInteger balance;//余额

@end

//Person类

@class Account;

@interface Person : NSObject

@property(nonatomic,copy)  NSString * name;

@property(nonatomic,strong)Account  * account;

@end

 

#import "Person.h"

#import "Account.h"

 

@implementation Person

//注册监听器

-(void) setAccount:(Account *)account

{

    _account=account;

    [_account addObserver:self forKeyPath:@"balance" options:NSKeyValueObservingOptionNew context:nil];

}

//监听

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

{

    if([keyPath isEqualToString:@"balance"])

    {

       NSLog(@" balancechange...");

    }

}

//删除监听器

-(void) dealloc

{

    [_account removeObserver:self forKeyPath:@"balance"];

}

 

@end

 

//主函数

int main(int argc,const char * argv[])

{

    @autoreleasepool

    {

        Account * account=[[Accountalloc] init];

        Person  * person=[[Personalloc] init];

       

        //KVC

        [person setValue:@"ssl"forKey:@"name"];

        [person setValue:accountforKey:@"account"];

        [person setValue:@12forKeyPath:@"account.balance"];

    }

    return 0;

}


原文地址:http://www.cnblogs.com/kenshincui/p/3871178.html 

 

 

 

 

 

KVC/KVO底层实现原理

KVC: Key-value coding is a mechanism for indirectly accessing anobject’s attributes and relationship...
  • wzxq123
  • wzxq123
  • 2016年05月27日 17:15
  • 1832

ios中对KVO、KVC的一些理解

Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者,相当于设计模...
  • kuloveyouwei
  • kuloveyouwei
  • 2014年02月28日 15:25
  • 9390

iOS中KVC与KVO的区别

一、KVC与KVO *“KVC”:key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *“KV...
  • sevenquan
  • sevenquan
  • 2015年12月23日 15:33
  • 459

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

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月13日 22:12
  • 15546

KVC和KVO底层原理

了解更多iOS底层原理知识,关注腾讯课堂八点钟学院iOS高级开发 iOS学习交流QQ群431449751KVC和KVO想必都熟知的一个名词,采用观察者模式,那么KVC到底是个什么,KVO又是什么,它...
  • sunyong445
  • sunyong445
  • 2016年12月18日 13:40
  • 457

IOS开发(39)之KVC KVO KVB

KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一...
  • u010013695
  • u010013695
  • 2013年05月03日 14:13
  • 1395

KVC/KVO 进阶(一) 底层原理

导语 上篇文章介绍了一些KVC/KVO的简单用法,本篇介绍一下KVC/KVO的底层原理。 创建 person 和 car 类person.h@class Car; @interface Persi...
  • u014641631
  • u014641631
  • 2016年10月27日 15:32
  • 400

KVC 和 KVO 的一点理解

KVC 用 KVC 实现高阶消息传递 valueForKey: 有很多有用的特例,比如说 NSArray 和 NSSet 这样的容器类都覆盖了这个方法。valueForKey: 被传递...
  • chaoyuan899
  • chaoyuan899
  • 2015年03月29日 10:59
  • 4638

数组 NSArray 排序 数组的KVC,KVO

#import int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *array =...
  • liyunxiangrxm
  • liyunxiangrxm
  • 2016年02月29日 17:19
  • 1050

Swift中KVC和KVO的使用

原创BLog,转载请注明出处 Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是一种间接访问对象的机制 key的值就是属性名称的字符串,返...
  • Hello_Hwc
  • Hello_Hwc
  • 2014年10月29日 19:24
  • 10841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:KVC、KVO
举报原因:
原因补充:

(最多只允许输入30个字)