键值编程之KVC

写在前面

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值