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: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)的更多相关文章
- [原创]obj-c编程16:键值编码(KVC)
原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...
- 《苹果开发之Cocoa编程》键-值编码和键-值观察
一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...
- 键值编码 KVC
http://www.cnblogs.com/dyf520/p/3805297.html 1,什么是Key-Value Coding? Key-Value Coding是一种间接访问对象属性的机制,使 ...
- 键值编码KVC
动态设置:setValue:属性值 forKey:属性名用于简单路径:setValue:属性值 forKeyPath:属性路径用于复合路径,例如Person有一个Account类型的属性,那么pers ...
- Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础
结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
随机推荐
- 侧滑面板(对viewGroup的自定义)
额,好吧,最近一直在做侧滑的事情,到目前为止一共是学了三种方法了,一个是直接加第三方开源框架SlidingMenu,第二给是用DrawerLayout,今天这个是用谷歌官方提供的在新的support- ...
- 2.关于QT中的Dialog(模态窗口),文件选择器,颜色选择器,字体选择器,消息提示窗口
1 新建一个空项目 A 编写 .pro文件 QT += gui widgets HEADERS += \ MyDialog.h SOURCES += \ MyDialog.cpp B 编写MyD ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- 从二进制数据流中构造GDAL可以读取的图像数据
在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...
- Hash冲突解决
hash的冲突不可避免的 1.开放地址法 开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,-,k(k<=m-1) 其中,m为哈希表的表长.di 是产生冲突的时候的增量 ...
- nginx root、alias、location指令使用方法
一.nginx root指令 1. Nginx配置 相关配置如下图: 通过配置root目录到"/wwwroot/html/"位置 在用虚拟主机方法,主机名称是test,需要大家配置 ...
- JS中回调函数的写法
<!DOCTYPE HTML> <html><head> <meta charset="GBK" /><title>回 ...
- linux杀死进程的简单讲解
一. 终止进程的工具kill .killall.pkill.xkill 终止一个进程或终止一个正在运行的程序,一般是通过kill .killall.pkill.xkill 等进行.比如一个程序已经死掉 ...
- FSG报表打印报错,log文件显示java.sql.SQLException: No corresponding LOB data found
报错信息: +---------------------------------------------------------------------------+ Plsql 程序的日志信息开始 ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...