我们可以借助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:0];
	}

	-(id)init:(int)i_v{
		self = [super init];
		if(self){
			ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\
				mki(100),nil];
			i = [NSNumber numberWithInt:i_v];
		}
		return self;
	}
@end

int main(int argc,char *argv[])
{
	@autoreleasepool{
		Son *son = [[Son alloc] init];
		[son setValue:mki(1001) 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

2014-07-06 15:51:56.098 k[1386:507] 1001

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:0];
	}

	-(id)init:(int)i_v{
		self = [super init];
		if(self){
			ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\
				mki(100),nil];
			i = [NSNumber numberWithInt:i_v];
		}
		return self;
	}
@end

int main(int argc,char *argv[])
{
	@autoreleasepool{
		Son *son = [[Son alloc] init];
		[son setValue:mki(1001) forKey:@"i"];
		msg(@"%@",[son valueForKey:@"i"]);
		msg(@"%@",[son valueForKeyPath:@"ary.@count"]);

		Son *son0 = [[Son alloc] init:11];
		Son *son1 = [[Son alloc] init:200];
		Son *son2 = [[Son alloc] init:25];

		NSArray *ary = [NSArray arrayWithObjects:son,son0,son1,son2,nil];
		msg(@"avg:%@",[ary valueForKeyPath:@"@avg.i"]);
		msg(@"sum:%@",[ary valueForKeyPath:@"@sum.i"]);

	}
	return 0;
}

运行结果如下:

apple@kissAir: objc_src$./k

2014-07-06 15:51:56.098 k[1386:507] 1001

2014-07-06 15:51:56.100 k[1386:507] 4

2014-07-06 15:51:56.100 k[1386:507] avg:309.25

2014-07-06 15:51:56.101 k[1386:507] sum:1237

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

  1. [原创]obj-c编程16:键值编码(KVC)

    原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...

  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. RocketMQ,JStorm与Tair使用笔记

    关于RocketMQ 启动mq nohup sh mqnamesrv -n 10.150.0.94:9876 &  nohup sh mqbroker -n 10.150.0.94:9876 ...

  2. JVM学习之-栈

    JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放.放在哪儿,另外JVM堆中存的是对象.JVM栈中存的是基本数据类型和JVM堆中对象的引用. ...

  3. Android的ToggleButton和Switch以及AnalogColok和DigitalColok的用法-android学习之旅(二十)

    ToggleButton 和Switch简介 ToggleButton 和Switch都是继承了Button,所以他们的属性设置和Button差不多. 分别支持的属性 ToggleButton 的属性 ...

  4. unity使用ugui自制调色面板

    突然想实现一个调色面板,然后开工... 首先找找有没有什么接口可调,木有找到,找到一些调用win32实现的本地颜色面板的调用,感觉不科学,反正多平台肯定是搞不定的. 既然没找到,还是老老实实的自己写吧 ...

  5. java编程小记

    http://blog.csdn.net/pipisorry/article/details/51050189 很久没写java,什么都不会了,小记一下. 类型转换 字符串转int类型:Integer ...

  6. Linux下使用gcc编程初体验

    近期刚刚放弃了Windows,投入了Ubuntu 的怀抱.今天就拿一个小小的案例来做一下C语言的编译和运行流程.额,顺便说一句.本文适合那些Linux新手,不适合老鸟哈. 看完本文可以学到什么? 程序 ...

  7. 精通CSS+DIV网页样式与布局--图片效果

    提到图片效果,小伙伴们可能会想到美图秀秀,ps等,这些软件都是款非常不错的照片处理软件,包括常用的:黑白,增强,高斯,高对比,夜视,老照片和铅笔画等等.不管你是否是专业的 照片拍摄人员,我们都可以通过 ...

  8. Mysql insert语句的优化

    1) 如果你同时从同一客户插入很多行,使用多个值表的INSERT语句.这比使用分开INSERT语句快(在一些情况中几倍).    Insert into test values(1,2),(1,3), ...

  9. ROS_Kinetic_16 ubuntu中安装使用Matlab和ROS

    ROS_Kinetic_16 ubuntu(16.04)中安装使用Matlab(2015b)和ROS(kinetic) 参考网址:http://cn.mathworks.com/hardware-su ...

  10. (七十)Xcode5及以上对于状态栏和导航栏样式的设定方法

    [状态栏] 在Xcode5以前,状态栏是通过UIApplication单例来管理的,而在此后,默认情况下状态栏通过控制器来管理,而且如果控制器有NavigationController,那么设置状态栏 ...