KVC与KVO

Swift4 - KVC与KVO KVC和KVO是我们开发中常用的功能,现在来看一下在Swift4中的变化 KVC 在Swift4的时候,Struct也支持KVC,我们不在使用setValue: forKeypath的方式,而是使用新的语法特性,索引,下面看一下例子,参考这里: struct Person { var name: String } struct Book { var title: 阅读详情

原文:http://www.cocoachina.com/macdev/cocoa/2009/0611/221.html


KVC(Key-Value Coding)和KVO(Key-Value Observing)可能是Objective-C中最强大最实用的功能之一。

         当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

        设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。

 

Core Data参数

 

        在其中一个方法中,我做了一个单独的对象,来响应参数请求。这样程序的任何部分要调用参数时,无需每次都在需要时必须创建NSfetchRequest,而是直接通过一小段干净的代码直接获取。这样一来,程序的其他部分只需要这样简单地进行调用:

 

NSString *companyName = [[Company shared] valueForKey:kCompanyName];

而无需使用下面这么多代码:

 

NSString *companyName = nil;

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Parameter"inManagedObjectContext:managedObjectContext]]];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", kCompanyName]];

NSError *error = nil;
companyName = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
NSAssert(error == nil, ([NSString stringWithFormat:@"Error requesting parameter: %@\n%@", kCompanyName,error]));

      

最糟糕的情况是当我想设置一个参数值时:


id parameter;

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Parameter"inManagedObjectContext:managedObjectContext]];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", key]];

parameter = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];

NSAssert(error == nil, ([NSString stringWithFormat:@"Error getting parameter %@:%@", key, error]));

if (!parameter) {
    parameter = [NSEntityDescription insertNewObjectForEntityForName:@"Parameter"inManagedObjectContext:managedObjectContext];
   [parameter setValue:key forKey:@"name"];
}

if ([value isKindOfClass:[NSNumber class]]) {
    [parameter setValue:[value stringValue] forKey:@"value"];
} else if ([value isKindOfClass:[NSDate class]]) {
    [parameter setValue:[value description] forKey:@"value"];
} else {
    [parameter setValue:value forKey:@"value"];
}

        你可以看出来,在第5或者第6次插入这段代码,仅仅为了从Core Data存储中获取一个小小的参数。

        要注意的是这些参数和NSUserDefaults不同,NSUserDefaults用来保存应用程序级的参数是很棒的,但是如果你需要保存文档级的参数,就不能用NSUserDefaults了。

        为了不用写大量代码来存取Core Data堆栈,参数可以集中放置在单独的对象中。这个对象可以面向程序的任何部分。然后所需的参数通过valueForUndefinedKey:方法直接读取或者通过setValue:forUndefinedKey:方法直接设置,看一下下面的例子


- (id)valueForUndefinedKey:(NSString *)key;
{
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:[NSEntityDescription entityForName:@"Parameter"inManagedObjectContext:managedObjectContext]]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", key]];
   
    NSError *error = nil;
    NSManagedObject *parameter = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error requesting parameter: %@\n%@", key, error]));
    return [parameter valueForKey:@"value"];
}
 
- (void)setValue:(id)value forUndefinedKey:(NSString *)key 
{
    [self willChangeValueForKey:key];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:[NSEntityDescription entityForName:@"Parameter"inManagedObjectContext:managedObjectContext]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", key]];
    NSError *error = nil;
    NSManagedObject *parameter = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error getting parameter %@:%@" , key, error]));
    if (!parameter) {
        parameter = [NSEntityDescription insertNewObjectForEntityForName:@"Parameter"inManagedObjectContext:managedObjectContext];
        [parameter setValue:key forKey:@"name"];
    }
    if ([value isKindOfClass:[NSNumber class]]) {
        [parameter setValue:[value stringValue] forKey:@"value"];
    } else if ([value isKindOfClass:[NSDate class]]) {
        [parameter setValue:[value description] forKey:@"value"];
    } else {
        [parameter setValue:value forKey:@"value"];
    }
    [self didChangeValueForKey:key];
} 



        你可以看出,这段代码非常直接。不过代码中仅有一个地方在整个程序中没有被丢掉。另外,如果我希望修改存储参数的位置,我只需修改一次即可。
        通过使用valueForUndefinedKey:方法,我可以避免每次希望保存参数时都修改代码。最后,由于参数的键被认为是在单独对象中的值,我可以在它改变的时候观察并接收到通知,这样我可以将Interface Builder中的绑定直接用到这个对象上



 

Android AudioFlinger(一)——初识AndroidAudio Flinger AudioFlinger 是 Android 系统中的音频中间层(audio HAL, Audio Hardware Abstraction Layer)的一部分,负责管理音频的混音、播放和音量控制等功能。它充当 Android 应用程序和音频硬件之间的桥梁。 阅读详情

相关推荐

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1077

【iOS】—— KVO与KVC

KVC的全称是,俗称“键值编码”,可以通过一个key来访问某个属性;KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量;它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。

qq_72437394的博客 1439

Zotero内存占用与存储优化:从根源解决卡顿与空间不足

文献管理软件在学术工作中扮演着重要角色,其核心原理是通过数据库管理元数据与附件文件,实现文献的快速检索与组织。然而,随着文献库规模增长,软件的资源管理机制可能面临挑战,尤其是内存占用与存储空间优化问题。从技术价值看,高效的附件管理策略不仅能提升软件响应速度,还能确保数据安全与可移植性。在实际应用场景中,研究者常遇到软件卡顿、存储目录膨胀等痛点,这通常与附件存储模式、缓存机制及数据库维护有关。本文聚焦于Zotero这一主流工具,针对其内存占用高、文件无法删除等常见问题,提供了外置存储、链接附件、数据库维护等系

weixin_34209060的博客 460

【iOS】—— KVC与KVO

KVC的全称是,俗称“键值编码”,可以通过一个key来访问某个属性;KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量;它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。KVO的全称是,俗称“键值监听",可以用于监听某个对象属性值的改变;KVO是苹果提供的在套事件通知机制。KVO和都是iOS中观察者模式的一种实现,区别。...

m0_55124878的博客 1986

卡尔曼滤波原理详解及系统模型建立(simulink)

卡尔曼滤波原理详解及系统模型建立(simulink) 卡尔曼滤波器 卡尔曼滤波器是在上个世界五六十年代的时候提出的,到今天已经有六十年左右的时间,但卡尔曼滤波算法不管在控制、制导、导航或者通讯方面对数据的预测能力依然处在一个不可撼动的位置上,但是很多人对于其算法内部的工作原理究竟是怎么运作的依然不理解,所以在工程上很多人都只是把卡尔曼滤波当成是一种“黑箱”预测算法,并不清楚内部原理。但实际上没有任...

weixin_43942325的博客 7万+

高功率半导体叠阵激光准直

摘要:研究针对高功率半导体激光器叠阵的光束整形问题,通过Zemax软件模拟5个巴条(间隔1.81mm)的LD阵列(总功率300W)。采用非序列模式建立模型,设置慢轴/快轴发散角分别为5°和19.5°,并配置包含19个发光点的巴条结构。通过S-TIH53材质的快轴准直镜(焦距0.6mm)和慢轴准直镜(焦距2.88mm)进行光束整形,有效降低了快慢轴发散角。仿真结果表明该方法能显著改善叠阵激光的光束质量,为高亮度光纤耦合提供了解决方案。

Zhaxibamao的博客 915

KVC KVO KVB

KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的

把握自己。 3368

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

KVO & KVC

KVC&&KVO在swift中用法

yueliangmua的博客 1122

【Photoshop JSX脚本】强大的事件监听器脚本 - event_listener.jsx

新手第一次了解的事件监听一定是ScriptingListener.8bi插件,如果你对此插件有了基本运用,那么现在了解一款更方便的时间监听脚本event_listener.jsx。不再像ScriptingListener.8bi插件那样晦涩难懂。 1、准备event_listener.jsx文件到 F:\Program Files\Adobe Photoshop 2020\Presets\...

Greless的后花园 8207

IMEI引起的无法驻网问题

问题不复杂,场景很简单,如上图,UE在进行LTE attach过程时,在送完NAS security mode complete后,就立刻收到了网络attach reject 带cause 6 Illegal ME,根据协议描述这个cause 代表ME不被网络可接受,例如ME在禁止名单或者黑名单中就会有这种cause。然而前方在报这个问题的时候,也是知道SIM卡和手机IMEI在运营商那边没能成功绑定,然后才报的问题,要查看手机是不是有问题...... 告诉前方原因后,还认为是手机问题,告知要继续查。

asd199086的博客 1426

KVO、KVC的探究

前言 撕下包装探究实质KVO 自实现简易KVO step1派生子类并将被监听的对象isa指针指向派生的新类 step2监听属性的有效性是否能正常获取setter方法 step3重写setter方法 step4释放动态绑定的监听者对象 KVC 明好坏知得失 总结前言KVO(Key Value Observing)即键值监听,是一种观察者模式,当所观察的属性值被修改时,能通知充当观察者的对象的一种机制。

ZeroOnet的博客 1946

ABAP CDS 视图的 SAP 缓冲全解析:从 DDIC-based 到 View Entity Buffer 的最佳实践与可运行示例

本文深入探讨了SAP ABAP CDS视图中的缓冲机制,重点介绍了在DDIC-based CDS视图中使用@AbapCatalog.buffering.*注解以及在CDS View Entity中使用独立缓冲对象两种配置方式。文章首先阐述了SAP缓冲的价值,特别适用于读多写少的业务场景(如主数据访问),能够显著降低数据库负载和响应延迟。核心内容分为三部分:1)DDIC-based CDS视图中的三个关键注解(缓冲状态、缓冲类型和通用缓冲键字段数)及其使用限制;2)新一代CDS View Entity中通过独

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 187

【iOS】——KVC和KVO

key的值必须正确,如果拼写错误,会出现异常。当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来。因为类可以反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去。NSArray/NSSet等都支持KVC。可以通过KVC访问自定义类型的私有成员。

m0_73974920的博客 2613

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

KVC\KVO介绍

转载自:http://blog.youkuaiyun.com/zhaozy55555/article/details/8598374 仅供自我学习,感谢楼主。 一.KVC和KVO的概念 1> KVC:NSKeyValueCoding的简称,是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。 2>

guicl0219的专栏 5394

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

iOS 再谈KVC、 KVO

参考链接: https://www.jianshu.com/p/badf5cac0130

ws1836300的博客 1168

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

什么是KVC和KVO?

一.KVC和KVO的概念 1> KVC:NSKeyValueCoding的简称,是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。 2> KVO:NSKeyValueObserving的简称,当指定的对象的属性被修改了,允许对象接收到通知的机制。 二.KVC介绍 1、概述 KVC是KeyValu

飞天鱼的专栏 3792

ios 通过kvc修改属性会触发kvo_底层原理 - KVO/KVC

底层原理 - KVO/KVC一、KVO1、概述KVO的全称是KeyValueObserving,俗称“键值监听",可以用于监听某个对象属性值的改变;KVO是苹果提供的在套事件通知机制。KVO和NSNotificationCenter都是iOS中观察者模式的一种实现,区别是:NSNotificationCenter可以是一对多的关系,而KVO是一对一的;2、KVO的使用使用KVO分为三个步骤:1、注...

weixin_39541121的博客 1050

【iOS开发】——KVO与KVC

iOS开发——KVO与KVC

weixin_51638861的博客 1926

KVO/KVC系列之一——什么是KVC

在iOS开发过程中,我们经常会听到或者用到KVO/KVC,但是对于什么是KVO和KVC,我们可能没有那么了解。下面先让我们来了解一下什么是KVC. 在苹果的官方文档中是这样描述KVC的:它是一种通过字符串描述符而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制,

somus的专栏 2650

iOS kvo kvc

Objective-C还支持一种更灵活的操作方式,这种方式允许以字符串形式间接操作对象的属性,这种方式的全称是(简称),即键值编码。无论是setValue:属性值forKey:还是valueForKey:属性名:,它们的实现逻辑都是差不多的:1.首先会从调用方法的类中寻找setter或getter方法,找到就调用,否则下一步2.然后从调用对象中找_name成员变量,找到赋值,否则下一步3.从调用对象中找name成员变量,找到赋值,否则下一步4.调用方法或。

m0_74217598的博客 1287

kvo与kvc

(1)KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。 KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制

hurosezhang的博客 613

[iOS开发]KVO+KVC

文章目录KVO什么是KVOKVO的基本使用手动调用KVOKVO的本质NSKVONotifying_Person内部实现setter的实现不同KVO部分相关问题KVC什么是KVC基础操作多级访问传参nil处理非对象KVC获取值的过程setValue:forKeyvalueForKeyKVC操作使用场景动态的取值和设值多值操作用KVC来访问和修改私有变量修改一些控件的内部属性 KVO 什么是KVO KVO全称Key Value Observing,其是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的

复杂化的博客 642

iOS KVC和KVO

一. KVC KVC也就是key-value-coding,即键值编码,最常见的两种用法就是: 1). 对私有变量进行赋值,同样的也可以通过它进行取值 对某一个属性进行赋值,可以不用加下划线,它的查找规则应该是:先查找和直接写入的字符串相同的成员变量,如果找不到就找以下划线开头的成员变量; [p setValue:@170 forKey:@"height"]; [p valueForKey:@"height"]; forKeyPath是包含了 forKey这个方法的功能的,甚至 forKeyPath

春风酿酒的博客 1114
上一篇: iOS编程之UIPickerView
下一篇: 在Flash Builder中使用条件编译
pibread
博客等级 码龄17年 9粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值