KVC KVC是Key-value coding的缩写,是一种通过key-value的方式获取对象属性的机制。 More about KVC KVO Apple Document about KVO KVO的实现方式:isa-swizzing Lightweight Key-Value Observing
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思。KVO是Key-Value Observing的简写,是键值观察的意思。 那么我们能拿KVC和KVO干些什么事呢?这两个缩写单词不能否认听起来挺高端的样子。这两个方法都是runtime方法,我们先来介绍KVC。 = sub; [kvc setValue:@"我是subName, 通过kvc的键路径来给我赋的值" forKeyPath:@"subKVC.subName"]; NSLog(@"subName = %@", [kvc valueForKeyPath:@"subKVC.subName"]); NSLog(@"%@", kvc); 上面代码的运行结果: 1 2 2014- ,当然啦还有在数组中使用KVC以及KVC中的运算-集合等,不做赘述啦。
当你发送符合键值的对象valueForKeyPath:消息时,可以在key path中嵌入一个集合运算符。 一个集合运算符是一个小的关键字列表之一,前面有一个符号(@),它指定了getter在返回之前以某种方式对数据进行处理。NSObject提供的valueForKeyPath默认实现实现了这种行为。
Theocoacao有篇不错的介绍NSArray和KVC的文章,我给粗略翻译了一下。 NSArray的-valueForKey: 有一个不是很显著的特性.
KVC Key Value Coding KVC是一种用间接方式访问类的属性的机制。比如你要给一个类中的属性赋值或者取值,可以直接通过类和点运算符实现,当然也可以使用KVC。 不过对于私有属性,点运算符就不起作用,因为私有属性不暴露给调用者,不过使用KVC却依然可以实现对私有属性的读写。 NSString *)key; - (void)setValue:(nullable id)value forKey:(NSString *)key; 也就是说,基本上Objective-C里所有的对象都支持KVC 对于_name,O-C会直接为其生成对应的setter和getter,所以可以通过点运算符操作属性,比如 person1.name = @"Wossoneri"; 可以看到KVC可以对私有变量进行操作 Swift的KVO与KVC Swift版本的的就看这篇文章吧,内容很详细。 漫谈 KVC 与 KVO Reference iOS开发系列—Objective-C之KVC、KVO
简介 KVC 是 KeyValue Coding 的简称,遵循 NSKeyValueCoding 协议,它是一种可以直接通过字符串的名字 key 来访问类属性的机制,而不是通过调用 setter、getter 对于 KVC,Cocoa 自动放入和取出基本数据类型放入 NSNumber 或 NSValue 中,当使用 setValue:ForKey: 或者 valueForKey: 时,它自动将基本数据类型从这些对象中取出 ,仅 KVC 具有这种自动包装功能,常规方法调用和属性语法不具备该功能。 综上,使用 KVC 访问属性的代价比直接使用存取方法性能开销要大。 值的正确性核查 KVC 提供属性值确认的 API,它可以用来检查 set 的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。
kvc在我的脑海里用来更改属性的实例变量值。 今天,他们遇到了kvc第二次去学习它,在网上看了很多博客,这似乎不符合我的口味,为了提取一些以下的。总结自己的。 怎样使用KVC 关键方法定义在:NSKeyValueCodingprotocol KVC支持类对象和内建基本数据类型。 @avg.point"]); } return 0; } KVC的实现细节: 搜索Setter、Getter方法 这一部分比較重要,能让你了解到KVC调用之后。 KVC还提供了以下的功能 2.4 值的正确性核查 KVC提供属性值确认的API。它能够用来检查set的值是否正确、为不对的值做一个替换值或者拒绝设置新值并返回错误原因。 以下摘录一段留言能让我们了解为什么会用kvc: . KVO是以KVC为基础的。有些监听不使用KVC操作会监听不到。 2. 假设用到Core Data。须要使用KVC做值的存取。
KVC(Key-value coding) 键值编码 基本使用 能够对对象的私有成员进行取值赋值 对数值和结构体型的属性进行的打包解包处理 实例: WTPerson.h #import <Foundation 判断是否可以直接访问成员变量 3、如果判断NO,直接执行KVC的setValue:forUndefinedKey:(系统抛出一个异常,未定义key) 4、如果是YES,继续找相关变量_<key> _is KVC自定义 自定义KVC代码实现 创建分类NSObject+KVC NSObject+KVC.h #import <Foundation/Foundation.h> @interface NSObject *)key; @end NSObject+KVC.m #import "NSObject+KVC.h" #import <objc/runtime.h> @implementation NSObject KVC异常处理及正确性验证 KVC异常处理 1、赋值为空 setNilValueForKey 2、Key值不存在 setValue:forUndefinedKey 正确性验证 validateValue
NSKeyValueCoding.h这个头文件里, 是一些KVC分类定义的集合。 二、基本使用 1.1、常规取值赋值 访问属性成员: 正常点语法取值赋值 貌似很平常,没什么特别.. 继续.. 小结: 正常取值赋值,三种情况, 有三种不同的情况 1.2、KVC取值赋值 访问属性成员: KVC取值赋值: 访问非属性成员: KVC取值赋值: 访问@private或默认@protected成员 KVC 取值赋值: 小结: KVC取值赋值,三种情况, 同一种方式访问。 三、总结 正常的取值赋值和KVC取值赋值,作完对比之后, 发现了KVC的不同之处了么? 这是KVC系列的开篇,下篇会继续探究KVC, 敬请期待...
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性 kvc: kvc key value coding 键值对编码 可以通过 【实体类
之前我写过两篇文章详细介绍过KVC的用法: KVC详解(上) KVC详解(下) 这篇文章是在上述两篇文章的基础上做一个原理性的补充。 首先呢,我们来聊一聊苹果开发文档。 KVC的底层原理探究 我们知道,可以通过KVC来对对象的属性进行动态地赋取值,那么其内部是如何实现的呢? 实际上,在官方文档中已经解释的很清楚了: KVC设值: ? KVC取值: ? 实际上,关于KVC设置与取值的过程,我在KVC详解(上)中有过详细说明,不过之前的文章中有些地方有些遗漏,我在这里补充说明下。 ? 自定义KVC 苹果只给我们提供了KVC的文档,并没有将KVC的源码开源出来。因此,为了加深理解,我按照官方文档的步骤说明,自定义了一个简易版的KVC。 通过KVC详解(上)中的介绍我们也知道了,苹果的KVC源码也是通过给NSObject等类添加类目的形式来实现的。
1.在KVC中使用keyPath 除了对当前对象的属性进行赋值外,还可以对其更深层的对象进行赋值。例如,对当前对象的location属性的country属性进行赋值。 KVC进行多级访问时,直接类似于属性调用一样用点语法进行访问即可。 NSArray *names = [array valueForKeyPath:@"name"]; 滑动显示更多 2.异常处理 当根据KVC搜索规则,没有搜索到对应的key或者keyPath, key{ NSLog(@"出现异常,该key不存在%@",key); } 滑动显示更多 重写这两个方法之后,运行程序不再崩溃,见下图: 但是我们可以根据业务需要,合理的处理KVC 根据苹果官方文档提供的设值、取值规则,我们可以自己进行KVC的自定义实现。
KVC相关: 1\. 通过KVC修改属性会触发KVO么? 2\. KVC的赋值和取值过程是怎样的?原理是什么? 什么是KVO? KVC的实现原理 1. 什么是KVC? KVC的全称key - value - coding,俗称"键值编码",可以通过key来访问某个属性 常见的API有: - (void)setValue:(id)value forKey:(NSString NSKeyValueObservingOptionOld; [self.person1 addObserver:self forKeyPath:@"age" options:options context:nil]; ///> 通过KVC KVC相关: 通过KVC修改属性会触发KVO么? 会触发KVO,如上流程图 KVC的赋值和取值过程是怎样的?原理是什么? 如上流程图 KVC可以修改私有属性和私有成员变量吗?
和KVO的keyPath一定是属性么 KVC 是可以直接设置成员变量的 KVO 必须手动实现 成员变量的监听 讲一下setValue:forKeyPath: 的作用 - (void)setValue:( } -------------------------------------------------------- 2019-03-04 22:37:26 carname = testCar 使用KVC 其实是会的,KVC 可以直接获取、修改类不想暴露的私有变量,所以会破坏面向对象的编程思想 TextView 设置placeholder的可以用到 KVC修改属性是否会触发KVO 答:会触发KVO WHY image 所以 - 如果没有set方法,KVC 也不一定会报错! ? (个人愚见,不喜请喷) KVO & KVC 的常见考题应该大致逃不出这些了,其实KVO & KVC 在考题上挺常见了,也算是高频考点了,但是感觉相对来说,题目还是偏初中级。
前面我们简单使用了KVC, 发现KVC能够对私有的成员进行取值赋值, 那么KVC的赋值取值的过程是什么样的?了解下.. _set<Key>:, setIs<Key>: 若没有相关方法 + (BOOL)accessInstanceVariablesDirectly,判断是否可以直接方法成员变量 如果是判断是NO,直接执行KVC countOfKey & objectInKeyAtIndex 若没有相关方法 + (BOOL)accessInstanceVariablesDirectly,判断是否可以直接方法成员变量 如果是判断是NO,直接执行KVC KVC赋值取值过程, 你学会了么? 这是KVC系列的第二篇,下篇会继续探究KVC, 敬请期待...
Tech 导读 通过分析Foundation框架中的KVC部分并结合案例分析KVC原理,解释为什么属性为简单数据类型的时候可以设置其值为字符串类型且不会崩溃的真实原因。 所以有了深入了解KVC的内部实现的想法! 使用KVC处理可以减少大量for的使用并增加代码可读性和健壮性。 下面是采用KVC的实现过程。 通过KVC的特性我们可以在日常使用中更加优雅的对数据进行筛选和处理。优点如下:可阅读性更高,健壮性更好。
KVC在Objective-C中的定义:KVC的定义都是对NSObject的,扩展来实现的(Objective-C中有个显式的 NSKeyValueCoding类别名-分类)。 见下图: 2.KVC提供的API方法 我们可以学习解读苹果的官方文档,对KVC有更深的理解。 常用方法:对于所有继承了NSObject的类型,也就是几乎所有的Objective-C对象都能使用KVC,下面是KVC最为重要的四个方法: - (nullable id)valueForKey:(NSString 设值取值顺序 KVC是怎么使用的,我们都很清楚,那么KVC在内部是按什么样的顺序来寻找key的呢? 所以你想重新定义KVC的一些功能,你可以添加这些方法,需要注意的是你的方法名要符合KVC的标准命名方法,包括方法签名。
KVC 是键值编码,一个非正式的 Protocol ,提供一种机制来间接访问对象属性,KVO 就是基于 KVC 实现的关键技术之一 在字典数组转模型数组时,使用这个setValuesForKeysWithDictionary
使用KVC 下面的函数 我将接通过KVC的接口 setValue forKey && setValue forKeyPath ,来设置属性 与 调用方法。 foo.bar.stringOnBar); //testforkeyle NSLog(@"%@",foo.stringOnFoo); //blah blah return 0; } 使用KVC [foo.bar.array valueForKeyPath:@"@sum.price"]; KVC的其他函数 //对于KVC的一些命令 ,如果要操作 NSArray 之类的字典可以方便的调用。
、Notification 区别及相关使用场景 KVC使用方法详解与底层实现 KVC(key value coding)键值编码是一种可以使用字符串形式来间接操作对象相关属性的方法。 KVC需要由类别Category NSKeyValueCoding来支持,OC在实现KVC时没有采用实现接口的方式,而是针对NSObject创建了一个类别,通过这样的方式使得NSObject的子类可以自行实现 KVC使用非常简单,但KVC却异常强大,最暗黑的功能就是它可以无视访问限制,无论是否为private都可以进行赋值或取值操作,readonly的属性也可以无视,提供了一种比runtime更便捷的方式来修改或访问系统级隐藏的属性 KVC基础方法详解 KVC常用方法主要由如下几个: //获取属性名为key的属性的值 - (nullable id)valueForKey:(NSString *)key; //设置属性名为key的属性的值为 当我们清楚的认识到上述KVC获取值和赋值的相关顺序后,也就理解了前一个栗子结果产生的原因,通过上面的讲解也可以发现其实KVC方法的效率并不高,KVC还是要去搜索getter、setter搜索各种成员变量