原文链接:obj-c编程16:键值编码(KVC)

我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性。下面的例子,借助于KVC的功能读取和设置了类Son实例的属性i:

 #import <Foundation/Foundation.h>

 #define msg(...) NSLog(__VA_ARGS__)
#define mki(x) [NSNumber numberWithInt:x] @interface Son:NSObject{
NSArray *ary;
NSNumber *i;
}
@property NSArray *ary;
@property NSNumber *i;
@end @implementation Son
@synthesize ary,i; -(id)init{
return [self init:];
} -(id)init:(int)i_v{
self = [super init];
if(self){
ary = [NSArray arrayWithObjects:mki(),mki(),mki(),\
mki(),nil];
i = [NSNumber numberWithInt:i_v];
}
return self;
}
@end int main(int argc,char *argv[])
{
@autoreleasepool{
Son *son = [[Son alloc] init];
[son setValue:mki() forKey:@"i"];
msg(@"%@",[son valueForKey:@"i"]);
msg(@"%@",[son valueForKeyPath:@"ary.@count"]);

运行结果如下:

apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation k.m -o k

apple@kissAir: objc_src$./k

-- ::56.098 k[:] 

KVC其中有KeyPath的概念,比如类Baba中有一个属性名为son,其是Son的对象;而类Son中也有属性NSString name,这时我们可以使用KeyPath的语法,像遍历树一样找到最终的属性name:

[baba valueForKeyPath:@"son.name"];

[baba setValue:@"tom" forKeyPath:@"son.name"];

除了遍历对象关系以外,我们还可以访问一些操作对象集合的函数,比如求平均数等等:

下面实际看一个例子

 #import <Foundation/Foundation.h>

 #define msg(...) NSLog(__VA_ARGS__)
#define mki(x) [NSNumber numberWithInt:x] @interface Son:NSObject{
NSArray *ary;
NSNumber *i;
}
@property NSArray *ary;
@property NSNumber *i;
@end @implementation Son
@synthesize ary,i; -(id)init{
return [self init:];
} -(id)init:(int)i_v{
self = [super init];
if(self){
ary = [NSArray arrayWithObjects:mki(),mki(),mki(),\
mki(),nil];
i = [NSNumber numberWithInt:i_v];
}
return self;
}
@end int main(int argc,char *argv[])
{
@autoreleasepool{
Son *son = [[Son alloc] init];
[son setValue:mki() forKey:@"i"];
msg(@"%@",[son valueForKey:@"i"]);
msg(@"%@",[son valueForKeyPath:@"ary.@count"]); Son *son0 = [[Son alloc] init:];
Son *son1 = [[Son alloc] init:];
Son *son2 = [[Son alloc] init:]; NSArray *ary = [NSArray arrayWithObjects:son,son0,son1,son2,nil];
msg(@"avg:%@",[ary valueForKeyPath:@"@avg.i"]);
msg(@"sum:%@",[ary valueForKeyPath:@"@sum.i"]); }
return ;
}

运行结果如下:

apple@kissAir: objc_src$./k

-- ::56.098 k[:] 

-- ::56.100 k[:] 

-- ::56.100 k[:] avg:309.25

-- ::56.101 k[:] sum:

[原创]obj-c编程16:键值编码(KVC)的更多相关文章

  1. obj-c编程16:键值编码(KVC)

    我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性.下面的例子,借助于K ...

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

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

  3. iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用

    键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...

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

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

  5. 键值编码 KVC

    http://www.cnblogs.com/dyf520/p/3805297.html 1,什么是Key-Value Coding? Key-Value Coding是一种间接访问对象属性的机制,使 ...

  6. 键值编码KVC

    动态设置:setValue:属性值 forKey:属性名用于简单路径:setValue:属性值 forKeyPath:属性路径用于复合路径,例如Person有一个Account类型的属性,那么pers ...

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

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

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

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

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

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

随机推荐

  1. 无废话MVC入门教程二[第一个小Demo]

    mvc技术交流,欢迎加群: 本文目标 1.了解"模型"."视图"."控制器"的创建.调试和使用过程. 本文目录 1.创建模型 2.创建视图 ...

  2. JSC学习笔记:JavaScriptCore 初识

    JSContext/JSValue JSContext是运行JavaScript的上下文环境,是一个全局环境实例:类似于浏览器端的window对象,表示浏览器的窗口:在浏览器中,所有JavaScrip ...

  3. Dict和Set类型

    花括号{}表示这是一个dict,用于类似给定一个名字,就可以直接查找分数,d={} 由于dict也是集合,len()函数可以计算任何集合的大小   使用dict本身提供的get方法,当Key不存在时, ...

  4. linux----ln

    1.格式 ln source_file_path target_file_path 2.执行ln 命令的用户要对source_file_path有写权限,才可以创建软连接. 3.souce_file这 ...

  5. Oracle 11g R2安装手册(图文教程)For Windows

    1.Oracle 11g R2安装手册(图文教程)For Windows 1.下载Oracle 11g R2 for Windows版本,下载地址如下 官方网站: http://download.or ...

  6. Emacs配置erlang开发环境(.emacs 文件)

    以前都是用sublime写erlang代码,好处不多说,主要是觉得一点不好用,不能实现函数跳转,及其不方便,尤其是代码一多,头疼.后来折腾过IntelliJ,下了个收费$0.00的版本,风格还是挺稀饭 ...

  7. WebMatrix安装和使用

    官网:http://www.microsoft.com/web/webmatrix/ 一直觉得dreamweaver已经过时了,很多新的库都不支持.而且,启动慢,占用内存多,是时候换一个ide了. h ...

  8. POJ 3740 DLX

    题意:给你一个01矩阵,然后求是否存在选择一些行,使得每一列的1的个数都为1. 思路:貌似朴素的DFS也可以,加点剪枝就可以过.这里贴个DLX的模版. 推荐博客:http://www.cppblog. ...

  9. aix 小机运维

    zzbank 一个月折腾总结小总结:#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#+    Ruiy-ge;#+#+    Te ...

  10. Hibernate 、多表关联映射-组件关联映射(component)

    组件关联映射可以将一些简小的数据与主题放在一个表中,例如firstName 和LastName这两个结合在一起可以组成一个名字,但是再分别将这两个再建一个表就不太合适了,这个时候可以用到组件关联映射: ...