键值编程之KVC

本文深入探讨了Objective-C中的键值编码(KVC),一种访问和操作对象属性的强大机制。KVC允许通过键名访问属性,无需直接调用访问方法。文章还介绍了KVC的工作原理、如何控制属性访问及如何使用KVC访问集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

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

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

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足同项目的需求。这包括但限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值