键值编程之KVC

原创 2016年08月31日 10:55:00

写在前面

Objective-C键值编程特性统称为键值编码(Key-Value Coding,KVC)和键值观察(Key-Value Observing,KVO)。本篇主要记录KVC的相关知识。
键值编码是一种访问对象属性的机制。可以通过键值编码KVC通过名称(键)访问和操作对象的属性,而无需使用访问方法或支持实例变量。其中键就是属性名称,而值就是属性的值。

详细内容

  • 下面是一个使用KVC的小例子
[obj valueForKey:@"key"];
[obj setValue:@"value" forKey:@"key"];

其中key就是类中的属性名称,value是想设置的值(支持id类型)。

  • 键值搜索模式
    当我们发出[receiver setValue:forKey:]消息时,KVC是如何访问类的实例变量的呢?
    以下步骤使用key进行搜索:

    1. KVC搜索符合set<`key>:格式的属性访问方法。其中key是属性的名称。若提供的key为”name”,KVC就会在目标类中搜索名为setName:的访问方法。
    2. 如果没有找到访问方法,根据类方法+accessInstanceVariablesDirectly;的返回值决定是否继续搜索。若方法返回YES,则继续匹配_<key>、_is<key>、<key>、is<key>格式的实例变量。如:_name、_isName、name、isName.
    3. 如果找到匹配的访问方法或者实例变量,就会设置值。如有必要,改值会被封装。
    4. 如果没有找到,接收对象的setValue:forUndefinedKey:就会被调用。
  • 控制KVC对属性访问

    1. + (BOOL)accessInstanceVariablesDirectly;
      可以让类控制 若果没有找到(属性的)访问方法,键值编码机制能否直接访问属性的支持变量。YES(默认)表示可以;NO表示不可以。你可以复写该方法达到你的要求。
    2. - (nullable id)valueForUndefinedKey:(NSString *)key; 和
      -(void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;这两个方法是用来处理传入的键不能和对象属性对应的情况,在默认情况下抛出NSUndefinedKey-Exception。
  • 使用KVC访问集合
    截止到目前,我们知道的都是一对一(一个属性对应一个实例变量或它的存取方法)的关系访问。除此之外,KVC可以访问如NSArray、NSMutableArray、NSSet、NSMutableSet类型的属性,也就是一对多的访问。此时,你要实现以下方法:
    这里写图片描述
    这里写图片描述

    • 访问集合的小例子
      假如Person类中有一个属性声明如下
      @property NSArray *hobbies;
      你可以使用KVC进行访问:
GYPerson *per = [[GYPerson alloc] init];
per.hobbies = @[@"13", @"233", @"2334"];
NSLog(@"%@", [per valueForKeyPath:@"hobbies.@count"]); // 数组中对象的个数
NSLog(@"%@", [per valueForKeyPath:@"hobbies.@max.length"]); // 数组中各个对象长度的最大值
NSLog(@"%@", [per valueForKeyPath:@"hobbies.@min.length"]); // 数组中各个对象长度的最下值
NSLog(@"%@", [per valueForKeyPath:@"hobbies.@avg.length"]); // 数组中各个对象长度的平均值

总结


  1. 基于配置的属性访问。通过KVC可以使用 由参数驱动的通用API 访问属性。
  2. 降低耦合性,提高软件的可维护性。
  3. 简化代码。在需要根据变量访问指定属性时,无需使用条件表达式进行判断需要访问的方法,直接使用KVC表达式,将变量作为其参数。

若大家发现错误,欢迎指正。共同交流,共同进步!谢谢阅读!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

KVC 键值编程的搜索模式

键值属性是一种访问属性的键值对机制,其中key是属性的名称,value是属性的值。 通过KVC可以减少代码量,在需要根据变量访问指定属性时尤其如此。 降低耦合性。 Key-value coding a...

obj-c编程16:键值编码(KVC)

我们可以借助obj-c中的键值编码(以后j)
  • mydo
  • mydo
  • 2014年07月06日 16:12
  • 1324

OC中键值编程(KVC)的实现

原文:http://disanji.net/2010/12/12/5-key-value-coding-approaches-in-cocoa-html/ Key-value c...

KVC键值编码

  • 2016年08月25日 20:02
  • 83KB
  • 下载

Oc KVC 键值编码

KVC (Key -Value -coding )键值编码 是一种间接地访问对象实例变量的机制 通过setValue: forKey :间接地为对象的实例变量做赋值 通过v...

【IOS】KVC(Key - value coding 机制) & KVO(键值观察)

键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性。该属性值改变时,会通知观察对象。它了解新值以及旧值;如果观察的属性为...

KVC键值编码

kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性。直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性。 下面介绍一下kv...

键值编码(KVC)KEY VALUE CODING

1.setValue: forKey:将person对象中的name属性作为Key值,并将这个Key对应的value设为张三,建立一个键值对//方法声明: - (void)setValue:(id)v...

Objective-C ---强大的KVC(key valued coding 键值编码) 详解

以前KVC只是简单会用,但不了解KVC的真正强大,突然觉得,现在能在功能上都实现,但却不懂一些机制的特性,从此我在慢慢捡回来,发现了解一些原理还是蛮有趣的。今天学习下KVC机制。一、简介 K...

Objective-C 【KVC(键值编码)】

下面提供解析代码,分步验证读者只需打开对应代码段即可。 Person.h #import #import "Dog.h" @interface Person : NSObject { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:键值编程之KVC
举报原因:
原因补充:

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