【基本概念】

1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。

2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。

3.键值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。

【键值访问】

键值编码中的基本调用包括-valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息字符串是我们关注属性的关键。下面是我演示的一个简单的例子:

(1)新建一个Book类,在头文件中加入如下属性:

  1. @property(strong,nonatomic) NSString *name;

(2)在main.m中实现如下:

  1. #import <Foundation/Foundation.h>
  2. #import "Book.h"
  3. int main(int argc, const charchar * argv[]) {
  4. @autoreleasepool {
  5. Book *book = [[Book alloc] init];
  6. [book setValue:@"老人与海" forKey:@"name"];
  7. NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
  8. }
  9. return 0;
  10. }

(3)输出结果如下:

是否存在setter、getter方法,如果不存在,他将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。这里我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。

【路径访问】

除了通过键设置外,键值编码还支持指定路径,像文件系统一样。用“点”号隔开。下面我给大家演示一个程序:

(1)新建一个Book类,在.h头文件中如下:

  1. #import <Foundation/Foundation.h>
  2. #import "Author.h"
  3. @interface Book : NSObject
  4. @property(strong,nonatomic) NSString *name;
  5. @property(strong,nonatomic) Author *author;
  6. @end

(2)新建一个Author类,在.h头文件中如下:

  1. #import <Foundation/Foundation.h>
  2. @interface Author : NSObject
  3. @property(strong,nonatomic) NSString *authorName;
  4. @end

(3)在main.m文件中实现如下:

  1. #import <Foundation/Foundation.h>
  2. #import "Book.h"
  3. //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。
  4. int main(int argc, const charchar * argv[]) {
  5. @autoreleasepool {
  6. Book *book = [[Book alloc] init];
  7. [book setValue:@"老人与海" forKey:@"name"];
  8. Author *author = [[Author alloc] init];
  9. [author setValue:@"海明威" forKey:@"authorName"];
  10. [book setValue:author forKey:@"author"];
  11. NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);
  12. NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
  13. [book setValue:@"是海明威吗?" forKeyPath:@"author.authorName"];
  14. NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
  15. }
  16. return 0;
  17. }

(4)输出结果如下:

【KVC的简单运算】

此外,还可以应用一些字符做简单运算。sum,min,max,avg,count

【基本数据类型的封装】

KVC中的setValue: forKey: 方法和valueForKey:方法不能直接对基本数据类型进行操作,需要进行包装,示例代码如下:

    1. #import <Foundation/Foundation.h>
    2. #import "Book.h"
    3. //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。
    4. int main(int argc, const charchar * argv[]) {
    5. @autoreleasepool {
    6. Book *book = [[Book alloc] init];
    7. [book setValue:[[NSNumber alloc] initWithFloat:12.8] forKey:@"price"];//要在这里进行包装;
    8. NSLog(@"书本的价格是:%@",[book valueForKey:@"price"]);
    9. }
    10. return 0;
    11. }

KVC - 键值编码的更多相关文章

  1. iOS - KVC 键值编码

    1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...

  2. Property属性,&nbsp;KVC键值编码OC…

    1.属性:帮你自动生成setter 和 getter 方法      属性的声明:(写在.h中)      格式: @property 数据类型 属性名      属性的实现:(写在.m中)      ...

  3. Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...

  4. 使用KVC键值编码

    掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...

  5. 路径(keyPath)、键值编码(KVC)和键值观察(KVO)

    键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...

  6. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  7. 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

    键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...

  8. 《苹果开发之Cocoa编程》键-值编码和键-值观察

    一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...

  9. kvc(键-值编码)

    kvc(键-值编码) { NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值 ...

随机推荐

  1. QtSpeech会让Qt说话

    想要多了解QtSpeech,那么随着本文的文字往下走吧!QtSpeech是一个Qt封装的跨平台TTS(文本变成语音输出)API,在不同平台下利用系统自带的TTS引擎.在Windows下使用SAPI, ...

  2. 【转】GitHub平台最火的iOS开源项目——2013-08-25 17

    http://www.cnblogs.com/lhming/category/391396.html 今天,我们将介绍20个在GitHub上非常受开发者欢迎的iOS开源项目,你准备好了吗? 1. AF ...

  3. redis持久化(摘录)

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Ap ...

  4. Android开发百度地图(一)--显示基本地图

    最近由于比赛的需要,自己学习了一下百度地图的开发.希望以下的内容能够对大家有用. 一.开发前的准备工作: 1.注册百度账号,并登录.(有百度账号的话直接登录) 2.申请Key,地址:http://de ...

  5. JavaScript日常会跳的坑系列(二)

    1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ...

  6. 在List中找出最大值的两种方法

    先说需求:找出一个对象List中,某个属性值最大的对象. 1.定义对象 private class A { public int ID { get; set; } public string Name ...

  7. ASP与ASP.NET转换Session数据桥的应用

    背景: 现有公司的产品OA是采用ASP早先的技术开发,需要与目前最新的ASP.NET产品进行数据交互的应用.现有的ASP应用程序往往采用“ASP Sessions”,这是一种经典的ASP内置模式,即允 ...

  8. CA 配置网站映射

     

  9. mysql查询缓存打开、设置、参数查询、性能变量意思

    http://blog.sina.com.cn/s/blog_75ad10100101by7j.html http://www.cnblogs.com/zemliu/archive/2013/08/0 ...

  10. ios PromiseKit

    简介: 高级开发是高度异步的,PromiseKit收集了一些帮助函数,让我们开发过程中使用的典型异步模式更加令人愉悦. 1.通过pod安装promisekit: 2. promise.h介绍 @imp ...