原文链接: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. 使用CRT定位内存泄漏

    1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...

  2. Lucene学习之初步了解

    全文搜索 比如,我们一个文件夹中,或者一个磁盘中有很多的文件,记事本.world.Excel.pdf,我们想根据其中的关键词搜索包含的文件.例如,我们输入Lucene,所有内容含有Lucene的文件就 ...

  3. PHP 魔术常量__FUNCTION__与__METHOD__的区别

    __FUNCTION__ 返回 函数名称(PHP 4.3.0 新加).自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写).在 PHP 4 中该值总是小写字母的.    __METHOD__ ...

  4. select函数详解及应用

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞程序 ...

  5. VB.NET让webbrowser控件中JS脚本错误最新方法(2013-09-16)

    最近也是在项目中遇到了webbrowser控件中想关闭JS脚本错误窗口的问题,所以经过多次测试,终于用一段高效实用的代码完美解决webbrowser控件中JS脚本错误窗口关闭的问题. 通过创建一个子线 ...

  6. 【Lucene】挖掘相关搜索词

    搜索引擎中往往有一个可选的搜索词的列表,当搜索结果太少时,可以帮助用户扩展搜索内容,或者搜索结果太多的时候可以帮助用户深入定向搜索.一种方法是从搜索日志中挖掘字面相似的词作为相关搜索词列表.另一种方法 ...

  7. CSS实现页面背景自动切换功能

    From here:http://xiaomiya.iteye.com/blog/2047728 请看效果图: 完整代码如下: <!DOCTYPE HTML> <html> & ...

  8. aix knowlgdgecenter

    http://www-01.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.install/doc/insgdrf/HT_insgdrf_ ...

  9. AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听

    在前面介绍了几种动画效果:透明动画效果(AlphsAnimation).移动动画效果(TranslateAnimation).旋转动画效果(RotateAnimation).缩放动画效果(ScaleA ...

  10. jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗

    function Person(name){ this.name=name; this.sayname=function (){ alert(this.name); } } function Stud ...