zoukankan      html  css  js  c++  java
  • 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 停止观察

  • 相关阅读:
    逻辑最复杂的MVVM模式实现
    剧本:博客园之天外飞仙
    本博客开始偏转方向,开始研究UDP在WCF下的实现
    Prism研究 目录
    Q & A category in Prism forums, with some answers and samples of mine.
    我眼中的SOA,以及在实际项目中的应用经验
    数据结构 C#描述 第三章 (更新)
    数据结构 C#描述 第四章
    数据结构 C#描述 第七章 (第一部分)
    数据结构 C#描述
  • 原文地址:https://www.cnblogs.com/shifenglin/p/5315338.html
Copyright © 2011-2022 走看看