KVC与KVO的理解

KVC与KVO是Objective C的关键概念。

Key—Value Coding (KVC) 即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制间接访问对象的属性。KVO就是基于KVC实现的关键技术之一。

一 . KVC

    (1)  Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor。 KVC定义了一种按名称访问对象的属性的机制,支持这种访问的主要方法是:

-(id)valueForKey:(NSString *)key;

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

-(id)valueForKeyPath:(NSString *)keyPath;

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

     (2) 一个对象拥有某些属性。比如说,一个 Person 对象有一个 name 和一个 address 属性。以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 address 的 key。 key 只是一个字符串,它对应的值可以是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另一个是获取 key 的值。如下面的例子:

@property(nonatomic,copy) NSString * name;

取值:

NSString * n = [object valueForKey:@"name"];

设定:

[object setValue:@"Shi" forKey:@"name"];

  (3)值得注意的是KVC不仅可以访问作为对象的属性,而且也能访问一些标量(例如int和CGFloat)和struct(例如CGRect)。例如:

@property(nonatomic) CGFloat height;

设置:

[object setValue@(20) forKey:@"height"];

 (4) KVC还可以通过关系来访问对象。假设 person 对象有属性 addressaddress 有属性 city,我们可以这样通过 person 来访问 city:

 [person valueForKeyPath:@"address.city"];

 (5) 使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题

- (void)setValue:(id)value forUndefinedKey:(NSString *)key;

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

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

  (6)setValuesForKeysWithDictionary 会为我们把和dictionaty的key名字相同的class proerty设置上dict中key对应的value。

 

二、KVO

Key-Value Observing(KVO)建立在KVC之上,它能够观察一个对象的KVC key path 值得变化。

(1)watchPersonForChangeOfAddress: 实现观察

(2)observeValueForKeyPath:ofObject:change:context; 在被观察的key path的值变化时调用。

(3)dealloc 停止观察

posted @ 2016-03-24 14:13  逆的态度  阅读(281)  评论(0编辑  收藏  举报