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 停止观察

  • 相关阅读:
    css子元素水平垂直居中
    js 防抖节流
    NOIP 游记
    flash player播放器用法
    android设备连接不上电脑的解决方法
    AndroidStudio自动下载gradle失败问题解决
    3组Alpha冲刺5/6
    3组Beta冲刺2/5
    3组Beta冲刺5/5
    3组Beta冲刺1/5
  • 原文地址:https://www.cnblogs.com/shifenglin/p/5315338.html
Copyright © 2011-2022 走看看