1KVC概述

KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制。Cocoa Programming中,Core Data,Application Scriptability, 绑定(Binding)技术和声明属性之一语言特性等,都是以KVC为基础的。(Application Scriptability 和 绑定(Binding)是Mac OS X上特有的)。你也可以用Key-value coding来简化你的代码。

KVC(键-值编码)是一个用于间接访问对象属性的机制,使用该机制不需要调用getset方法就可以设置或获取成员变量的值

2KVC的基础

Keys and Key Paths

KEY:键(Key)是一个标识了对象的某个属性的字符串。通常,在接收对象中,一个键对应的是一个访问方法或者实例变量的名称。Key必须是ASCII编码,以小写字母开头,并且不能包含空白符。

键的一些示例:payee, openingBalance, transactions, amount等

Key Path:键路径(Key Path)是一个由多个Key组成,Key与Key之间用点(.)分开的字符串,通过顺序遍历,获取对象属性。键路径中的键序列的第一个键相对于当前的接收对象,而后续的键只与前一个键对应的属性相关。

例如,对于键路径address.street,其中我们从当前的接收对象中获取address这一属性值,然后再通过这个address的对象属性去获取street属性。

使用KVC获取属性值:

方法valueForKey:

返回特定键对应的值,这个值是与接收对象相关的。如果输入的键没有对应的方法或者实例变量,接收对象会发出valueForUndefinedKey: 消息。方法valueForUndefinedKey:默认会抛出NSUndefinedKeyException异常,可以在子类中改写。

方法valueForKeyPath:

与之类似,返回特定键路径在对应接收对象中的值。当键路径的键序列中有任何一个键无法对应兼容KVC的对象,则接收对象都会发出valueForUndefinedKey: 消息。

方法dictionaryWithValuesForKeys:

对输入的键数组中的每一个键进行检索,返回包含了这些键对应的值的NSDictionary。

【备注】集合对象(Collection Object),如NSArray, NSSet, NSDictionary等不能包含nil值。可以使用NSNull来替代nil放入集合对象中标识空值。NSNull提供一个简单的实例来表示对象属性的nil值。在方法 dictionaryWithValuesForKeys: 和 setValuesForKeysWithDictionary: 中,NSNull和nil之间的转换是自动的,所以你的对象不用明确测试NSNull值。

使用KVC设置属性值:

方法setValue:forKey:

给特定的键设值,这个值相对于对应的接收对象或者是已经提供的值。

方法setValuesForKeysWithDictionary:

可以从字典映射到对象,不需要再给一一给对象来赋值。使用NSDictionary来给一组键设值。该方法内部调用setValue:forKey:给每一组键值对设值。想存入空值时,使用NSNull取代nil。 该方法常用于字典转模型中,比如:

- (instancetype)initWithDict:(NSDictionary *)dict

{

if (self = [super init]) {

self.icon = dict[@"icon"];

self.title = dict[@"title"];

self.answer = dict[@"answer"];

self.options = dict[@"options"];

}

return self;

}

+ (instancetype)questionWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];

}

可以用KVC写成:

+ (instancetype) questionWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];

}

- (instancetype)initWithDict:(NSDictionary *)dict

{

if (self = [super init]) {

[self setValuesForKeysWithDictionary:dict];

}

return self;

}

iOS开发之KVC的更多相关文章

  1. iOS开发之KVC全解

    一  KVC的基本概念 1.KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过g ...

  2. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  3. IOS开发之KVC与KVO简述

    KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...

  4. iOS 开发之 KVC - setValuesForKeysWithDictionary 解析

    从字典映射到一个对象,这是KVC中的一个方法所提供的,这个方法就是 setValuesForKeysWithDictionary:,非常好用,不需要你来一一的给对象赋值而直接从字典初始化即可,但用的不 ...

  5. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  6. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  7. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  8. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  9. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

随机推荐

  1. String,StringBuffer,StringBuilder个人认为较重要的区别

        今天在整理不可变对象知识点时,突然看到了String,StringBuffer,StringBuilder三者的区别,这里就挑一些我认为比较重要的点记录一下,方便日后查看.     Strin ...

  2. context:annotation-config, mvc:annotation-driven, context:compont-scan 区别

    当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如: 使用@Autowired注解,必须事先在Spring容器中声明AutowiredA ...

  3. java学习阶段三:运算符和结构学习

    import java.util.Scanner;/* * JAVA中运算符的学习: * 算术运算符:+.-.*./ 和 %,两个整数相除,结果还是整数. * 赋值运算符:=.+=.-=.*=./=. ...

  4. websevice(Web服务)基础

    webservice简介: 1.WebService到底是什么? WebService是一种跨编程语言和跨操作系统平台的远程调用技术.所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户 ...

  5. Thrift入门初探--thrift安装及java入门实例

    什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...

  6. 从SHAttered事件谈安全

    大新闻? 在刚刚过去的2017年2月23日,Cryptology Group at Centrum Wiskunde & Informatica (CWI)和Google的研究人员公开了2个P ...

  7. 撸基础篇系列,JAVA的NIO部分

    前言:撸基础篇系列,避免每次都要从头开始看,写个自己的知识体系树 NIO 核心就是异步, 比如,复制文件,让操作系统去处理,等通知 BIO核心类 一,BIO NIO基本操作类 Bytebuffer 构 ...

  8. Hibernate框架双向多对多关联映射关系

    建立双向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  9. 玩转 iOS 10 推送 —— UserNotifications Framework(合集)

    iOS 10 came 在今年 6月14号 苹果开发者大会 WWDC 2016 之后,笔者赶紧就去 apple 的开发者网站下载了最新的 Xcode 8 beta 和 iOS 10 beta,然后在自 ...

  10. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...