关闭

键值编程之KVC

标签: KVC
163人阅读 评论(0) 收藏 举报
分类:

写在前面

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表达式,将变量作为其参数。

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59223次
    • 积分:1968
    • 等级:
    • 排名:千里之外
    • 原创:143篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    最新评论