键值编码和通用编程

键值编码(KVC)是Cocoa一个通用的用于获取和设定值的一个协议。在编程中,“通用”这词是用于描述一种可以适用于不同情境的实现方式。通用代码可以减少项目中代码总量并使得软件可以处理程序员无法预知的情景。Cocoa至始至终都很重视通用、可复用代码。

KVC版看起来需要更多代码输入。让就让我选择一个更能体现KVC价值的场景。 
首先,我们定义一个类: 
@interface CDCPerson : NSObject 

    NSString * firstName; 
    NSString * lastName; 
    NSNumber * phoneNumber; 
    NSString * emailAddress; 

- (void) setFirstName:    (NSString *)value; 
- (void) setLastName:     (NSString *)value; 
- (void) setPhoneNumber:  (NSNumber *)value; 
- (void) setEmailAddress: (NSString *)value; 
@end

一些实际使用代码如下:

// 假设inputValues包含我们想设定到person上的键值 
NSDictionary *inputValues; 
CDCPerson    *person = [[CDCPerson alloc] init]; 
NSEnumerator *e = [inputValues keyEnumerator]; 
id dictKey, dictValue; 
while ( dictKey = [e nextObject] ) 

    dictValue = [inputValues valueForKey: dictKey]; 
    [person setValue: dictValue forKey: dictKey]; 
}

该代码段是通用的,意味着我们不需要在每次Person类添加新的实例变量的时候改变代码。 
但是还可以更好!如下就是一个上述代码的简化版本: 
// 假设inputValues包含我们想设定到person上的键值 
NSDictionary *inputValues; 
CDCPerson    *person = [[CDCPerson alloc] init]; 
[person setValuesForKeysWithDictionary: inputValues];

很隐晦吧?如下是Apple关于-setValuesForKeysWithDictionary:实现机制的解释: 
      通过键值对设定消息接收方的属性值,键用于识别各个属性。默认实现是对每个键值对调用setValue:forKey:,在键值对有NSNull值的情况下替换成nil。

换句话说,这和第一个例子没有什么区别。但是-setValue:forKey:到底做了些什么呢?这就是KVC的魔力所在。它实际上会找到-setFirstName:、-setLastName:、setPhoneNumber: 以及-setEmailAddress: 的实现并调用它们。如果无法找到这些,KVC会尝试几种可能直至最终将值设定到实例变量上。

时间: 2024-08-04 00:32:36

键值编码和通用编程的相关文章

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

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十七.键值编码 KVC 关于KVC的知识点将通过下列例子来展开说明: Person.h文件,Person类拥有name和age两个成员变量 @interface Person : NSObject { @private NSString *_name; NSInteger _age; } - (void)setAge:(NSIn

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

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self

iOS学习笔记(6)键值编码——KVC

在KVC编程方式中,无论调用setValue:forKey:方法,还是调用valueForKey:方法,都是通过NSString对象来指定被操作属性,其中forKey:标签用户传入属性名的. 对于setValue:属性值[email protected]“name”;代码,底层的执行机制如下. (1)程序优先考虑调用“setName:属性值;”代码通过setter方法完成设置. (2)如果该类没有setName:方法,KVC机制会搜索该类名为_name的成员变量,无论该成员变量是在类接口部分定义

IOS开发之旅-KVC【键值编码】

在日常开发中,读取修改对象的属性值时,通常是点调用对应的属性进行相关操作.另外一种方式是通过键值编码,简称KVC,在键值编码中主要使用以下方法 /* Given a key that identifies an attribute or to-one relationship, return the attribute value or the related object. Given a key that identifies a to-many relationship, return a

OC8-属性 KVC是键值编码

1.属性,是oc提供的一种快速的模式化的创建实例变量的方式. (1)属性是通过@property标记的, (2)属性会在背后,默默的帮我们做set和get方法 2.属性做的工作 (1)创建一个实例变量,名字是下划线加属性名, (2)帮我们自动get和setter 的方式,创建一组方法, 3.点语法,点语法是专门为了setter 和getter 方法配备的一种语法糖.会自动根据语法和语境调用是哪一种方法, (1) (.)其实就是转换成了getter 和setter 方法,p.hobby.lengt

KVC - 键值编码

[基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供. 3.键值编码支持带有对象值的属性,同时也支持纯数值类型和结构.非对象参数和返回类型会被识别并自动封装/解封. [键值访问] 键值编码中的基本调用包括-valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息

【OC学习-31】利用KVC即键值编码来访问一些对象的属性,尽管这些属性是私有的

最简单的想法是我们创建一个对象,然后利用某些方法给这个对象赋值,然后再用某些方法调用这个值.当然这种描述很类似于字典的键值概念,确实今天学习的就是这样一种方法:KVC,Key-Value coding键值编码. (1)简单的KVC 创建一个Book类,在Book.h里写一个私有的实例变量name,然后再main.m里创建一个book1对象,再给这个book1对象的私有变量name赋值,然后再调用这个值.神奇的地方就在这里:这种方法根本不管这个实力变量是private还是public.呃,Book

键值编码 || Cocoa绑定

什么是键值编码? 键值编码(Key-Value-Coding)是指,将表示对象包含的信息的字符串作为键值使用,来间接访问该信息的方式.键值编码提供了非常强大的功能,基本上,只要存在访问器方法,生命属性或实例变量,就可以将其名字指定为字符串来访问. 1.使用KVC 定义一个Student类,继承于NSObject. .h文件 #import <Foundation/Foundation.h> @interface Student : NSObject { NSString *name; } @e

键-值编码扩展

键-值编码扩展 CoreAnimation 扩展了 NSKeyValueCoding 协议,因为它从属 CAAnimation 和 CALayer 类.此扩展为某些键添加默认值,扩展封装约定,为 CGPoint.CGRect.CGSize.CATransform3D添加键路径支持 键-值编码遵从容器类 CAAnimation 和 CALayer 类是遵从容器类键-值编码,也就是说可以为任意键设置值.即使键没有在 CALayer类中声明的属性,你也可以用以下的方式设置值 [theLayer set