首页 > 其他分享 >浅谈 KVC

浅谈 KVC

时间:2023-08-15 22:32:28浏览次数:28  
标签:调用 浅谈 查找 error setter 方法 KVC

简介

KVC 是 KeyValue Coding 的简称,遵循 NSKeyValueCoding 协议,它是一种可以直接通过字符串的名字 key 来访问类属性的机制,而不是通过调用 settergetter 方法访问。

对于 KVCCocoa 自动放入和取出基本数据类型放入 NSNumber 或 NSValue 中,当使用 setValue:ForKey: 或者 valueForKey: 时,它自动将基本数据类型从这些对象中取出,仅 KVC 具有这种自动包装功能,常规方法调用和属性语法不具备该功能。

setValue:forKey 的实现方式:

以字符串的形式向对象发送消息,首先查找以 set<Key> 命名的 setter 方法,如果成员用 @property@synthsize 处理,因为 @synthsize 告诉编译器自动生成 set<Key>: 格式的 setter 方法,所以这种情况下会直接搜索到。如果上面的 setter 方法没有找到,如果类方法 accessInstanceVariablesDirectly 返回 YES,那么将在对象内部查找名为 _<key>_is<Key><key>is<key> 的实例变量。如果找到则设置成员的值,如果没有查找调用 setValue:forUndefinedKey:

valueForKey: 的实现方式:

  • 首先查找以 get<Key><key>is<Key> 命名的 getter 方法,找到直接调用。
  • 如果上面的 getter 没有找到,则会查找 countOf<Key>objectIn<Key>AtIndex:<Key>AtIndexes 格式的方法,找到就会调用 countOf<Key>objectIn<Key>AtIndex:<Key>AtIndexes 方法,还有一个可选的 get<Key>:range: 方法。
  • 若是还没查到,那么查找 countOf<Key>enumeratorOf<Key>memberOf<Key>: 格式的方法,如果找到就调用 countOf<Key>enumeratorOf<Key>memberOf<Key>: 方法。
  • 若是还没查到,那么如果类方法 accessInstanceVariablesDirectly 返回 YES,那么将在对象内部查找名为 _<key>_is<Key><key>is<key> 的实例变量。
  • 再没查到,调用 valueForUndefinedKey:

综上,使用 KVC 访问属性的代价比直接使用存取方法性能开销要大

值的正确性核查

KVC 提供属性值确认的 API,它可以用来检查 set 的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。

实现核查方法,为如下格式:validate<Key>:error:

- (BOOL)validateName:(id *)ioValue error:(NSError **)outError {
     // The name must not be nil, and must be at least two characters long.
     if ((*ioValue == nil) || ([(NSString *)*ioValue length] < 2]) {
         if (outError != NULL) {
             NSString *errorString = NSLocalizedStringFromTable(
                     @"A Person's name must be at least two characters long", @"Person",
                     @"validation: too short name error");
             NSDictionary *userInfoDict =
                 [NSDictionary dictionaryWithObject:errorString
                                             forKey:NSLocalizedDescriptionKey];
             *outError = [[[NSError alloc] initWithDomain:PERSON_ERROR_DOMAIN
                                                     code:PERSON_INVALID_NAME_CODE
                                                 userInfo:userInfoDict] autorelease];
         }
         return NO;
     }
     return YES;
 }
 复制代码

调用核查方法: validateValue:forKey:error:,默认实现会搜索 validate<Key>:error:格式的核查方法,找到则调用,未找到默认返回 YES

标签:调用,浅谈,查找,error,setter,方法,KVC
From: https://blog.51cto.com/u_14682436/7094587

相关文章

  • 浅谈5G技术会给视频监控行业带来的一些变革情况
    5G是第五代移动通信技术,能够提供更高的带宽和更快的传输速度,这将为视频技术的发展带来大量机会。随着5G技术的逐步普及与商用,人们将能够享受到更加流畅的高清视频体验,并且5G技术还拥有更低的延迟和更高的网络容量。这些优势不仅将推动视频技术的变革,也将创造出更多的商业机会和产业......
  • 浅谈AI浪潮下的视频大数据发展趋势与应用
    视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步,人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式,视频内容已经不再是单一的娱乐方式,更是涉及到教育、医疗、商业等各个领域。为了满足用户个性化的需求,视频大数据的分析和挖......
  • 浅谈无线物联网能耗在线监测系统的构建--安科瑞张田田
    摘要:为加强能耗管理,改变人工抄表的现状,柴里煤矿利用信息化技术、网络技术、数据库实时技术,建立了能耗在线监测平台,对能源介质的生产、输送和消耗及供能、用能设备状态进行动态监控和数字化管理,通过实施运行,实现了能源的科学调度,能损隐患及时排查,规避了用能浪费,具有较高的推广应用价......
  • 浅谈SMT行业MES系统生产管理的特点
    一、SMT生产车间在电子制造中起重要作用的部分,主要具备以下生产特点:1.高密度和高速度:SMT生产车间中的电子元器件一般来说较为精小,且被紧密地排列在PCB上。这就要求SMT生产车间的机械设备具备高精度和高速度,确保其精确地将元器件粘贴在指定的位置上。由于电子数码产品技术的不断进步......
  • 浅谈统一权限管理服务的设计与开发
    作者| 天地练心导读本文详细探讨了统一权限管理服务(MPS)的设计与开发,针对企业内部多平台权限管理混乱的问题,提出了一套综合RBAC、ACL、DAC权限模型的解决方案。文章从需求分析、技术选型、功能设计等方面全面介绍了MPS的构建过程。在平台&节点管理方面,MPS支持多种业务平台接入方式......
  • 塑料激光焊接机厂家镭拓浅谈塑料激光焊接技术在智能穿戴领域应用优势
    编辑:镭拓激光塑料焊接技术在近几年取得了非常快速的发展,尤其是医疗塑料以及汽车领域的应用可以说是非常成熟了。塑料激光焊接机除了可以应用于医疗类塑料器具和汽车塑料部件的加工之外,它在智能穿戴领域也是有着非常重要的应用。近几年随着科技技术的不断,各种功能丰富的智能穿戴设备......
  • 浅谈死锁
    1.死锁是如何产生 多个线程同时被阻塞它们其中的一个或者多个等待某个资源的释放而由于线程全部阻塞,资源的释放无限期的延迟因此程序不可能终止2.死锁的三个典型情况2.1一个线程一把锁,可重入锁没事,不可重入锁死锁2.2两个线程两把锁,即使是可重入锁,也会出现死锁publicclass......
  • 浅谈人工智能技术与物联网结合带来的好处
    物联网是指通过互联网和各种技术将设备进行连接,实时采集数据、交互信息的网络,对设备实现智能化自动化感知、识别和控制,给人们带来便利。人工智能是计算机科学的一个分支,旨在研究和开发能够模拟人类智能的技术和方法。人工智能通过模仿、延伸和扩展人类的自然智能,使计算机能够具备......
  • 浅谈关于电气线路短路引起的电气火灾的原因
    未晓妃安科瑞电气股份有限公司上海嘉定201801摘要:我国人口众多,同时对用电需求也非常多。我们日常生活需要电力来照亮我们的家园并为工业供电。它可以是建设性的,也可以是破坏性的,这取决于处理它的谨慎程度。稍有不慎,就会引发火灾,造成经济损失和惨痛的伤害。电气火灾中*危险的故障......
  • 浅谈什么是 Spring Cloud
    SpringCloud是一个用于构建分布式系统的开发工具包,它基于SpringFramework提供了一系列的解决方案和工具,用于帮助开发者快速构建和部署云原生应用。SpringCloud主要关注的是分布式系统中常见的配置管理、服务注册与发现、熔断器、负载均衡、路由、微服务追踪等问题,提供了一套......