KVC - 键值编码
【基本概念】
1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。
2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。
3.键值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。
【键值访问】
键值编码中的基本调用包括-valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息字符串是我们关注属性的关键。下面是我演示的一个简单的例子:
(1)新建一个Book类,在头文件中加入如下属性:
- @property(strong,nonatomic) NSString *name;
(2)在main.m中实现如下:
- #import <Foundation/Foundation.h>
- #import "Book.h"
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Book *book = [[Book alloc] init];
- [book setValue:@"老人与海" forKey:@"name"];
- NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
- }
- return 0;
- }
(3)输出结果如下:
。
是否存在setter、getter方法,如果不存在,他将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。这里我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。
【路径访问】
除了通过键设置外,键值编码还支持指定路径,像文件系统一样。用“点”号隔开。下面我给大家演示一个程序:
(1)新建一个Book类,在.h头文件中如下:
- #import <Foundation/Foundation.h>
- #import "Author.h"
- @interface Book : NSObject
- @property(strong,nonatomic) NSString *name;
- @property(strong,nonatomic) Author *author;
- @end
(2)新建一个Author类,在.h头文件中如下:
- #import <Foundation/Foundation.h>
- @interface Author : NSObject
- @property(strong,nonatomic) NSString *authorName;
- @end
(3)在main.m文件中实现如下:
- #import <Foundation/Foundation.h>
- #import "Book.h"
- //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Book *book = [[Book alloc] init];
- [book setValue:@"老人与海" forKey:@"name"];
- Author *author = [[Author alloc] init];
- [author setValue:@"海明威" forKey:@"authorName"];
- [book setValue:author forKey:@"author"];
- NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
- NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
- [book setValue:@"是海明威吗?" forKeyPath:@"author.authorName"];
- NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
- }
- return 0;
- }
(4)输出结果如下:
【KVC的简单运算】
此外,还可以应用一些字符做简单运算。sum,min,max,avg,count
【基本数据类型的封装】
KVC中的setValue: forKey: 方法和valueForKey:方法不能直接对基本数据类型进行操作,需要进行包装,示例代码如下:
- #import <Foundation/Foundation.h>
- #import "Book.h"
- //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Book *book = [[Book alloc] init];
- [book setValue:[[NSNumber alloc] initWithFloat:12.8] forKey:@"price"];//要在这里进行包装;
- NSLog(@"书本的价格是:%@",[book valueForKey:@"price"]);
- }
- return 0;
- }
KVC - 键值编码的更多相关文章
- iOS - KVC 键值编码
1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...
- Property属性, KVC键值编码OC…
1.属性:帮你自动生成setter 和 getter 方法 属性的声明:(写在.h中) 格式: @property 数据类型 属性名 属性的实现:(写在.m中) ...
- Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础
结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...
- 使用KVC键值编码
掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
- 《苹果开发之Cocoa编程》键-值编码和键-值观察
一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...
- kvc(键-值编码)
kvc(键-值编码) { NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值 ...
随机推荐
- TCP/IP协议原理与应用笔记15:网络连接设备
1. 网络连接设备: (1)转发器 Repeater/ 集线器 Hub (2)网桥 Bridge / 交换机 Switch (3)路由器 Router (4)网关 Gateway 2. 从通信角度看待 ...
- 1.Linux系统(CenntOS)固定IP的设定
首先:我们配置一个临时的固定的固定ip,作用是让我们用其他的shell工具连接虚拟机 ifconfig eth0 192.168.10.168 在主机用ping命令查询连通后再进行下一步 ping 1 ...
- samba服务器与远程登录ssh
作者:相思羽 出处:http://www.cnblogs.com/xiang-siyu 欢迎转载,也请保留这段声明.谢谢! deepin安装与配置samba服务器 安装 apt-get insta ...
- java.util.Stack类简介
Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...
- 简单的实现QQ通信功能(二)
第二部分:功能需求以及大体思路 一:功能需求: 1. 角色:登录用户. 2. 登录: (1)检查用户名和密码是否正确,正确登录成功,否则提醒用户名或密码错误. (2)登录时可以选择登录状态,送入数据库 ...
- tcl/tk实例详解——glob使用例解
glob命令 这里以实例的形式解释一下glob命令的用法,很多时候纯粹的语法讲解根本讲不清楚,往往没有一个例子清晰,一下就glob命令进行一些分析,环境为Tclsh85,操作系统为windows XP ...
- (转)十分钟搞定CSS选择器
原文地址:http://www.cnblogs.com/dolphinX/p/3347713.html 在最近的web开发中是不是就会用到一些选择器,发现很多尤其是CSS3新增的不太熟悉,在此总结一下 ...
- c#之内置类型
内置类型:就是.NET Framework System命名空间中写好的类型. 下面看看C#都有哪些内置类型 上面的内置类型,除了string和object外,其他的都被称作简单类型.也可以把左边的看 ...
- JAVA深入研究——Method的Invoke方法
http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用 ...
- Android 自定义Gallery浏览图片
之前写的<Android ImageSwitcher和Gallery的使用>一文中提到我在教室一下午为实现那个效果找各种资料.期间在网上找了一个个人觉得比较不错的效果,现在贴图上来: 其实 ...