obj-c编程16:键值编码(KVC)
2014-07-06 16:12
393 查看
我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性。下面的例子,借助于KVC的功能读取和设置了类Son实例的属性i:
运行结果如下:
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"];
除了遍历对象关系以外,我们还可以访问一些操作对象集合的函数,比如求平均数等等:
![](http://img.blog.csdn.net/20140706160104140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXlkbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面实际看一个例子
运行结果如下:
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
#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)
- 编程基础-java编码方式-UCS/UTF-16
- KVO(NSKeyValueObserving 键 - 值编码)与KVC(NSKeyValueCoding 键值观察机制)详解
- KVC 键值编码 权限非常强大,可以访问对象属性,包括私有
- [原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
- 键值编码和通用编程
- KVC-键值编码是一种间接地访问实例变量的方式
- obj-c编程17:键值观察(KVO)
- obj-c编程17:键值观察(KVO)
- Object-c基础编程学习笔记-键值编码
- KVO(NSKeyValueObserving 键 - 值编码)与KVC(NSKeyValueCoding 键值观察机制)详解
- 【Objective-C】OC中键值编码(KVC)的概念和使用方法
- OC-KVC-键值编码
- [原创]obj-c编程17:键值观察(KVO)
- OC中键值编程(KVC)的实现
- Object-C 学习笔记(三十三)--- KVC(键值编码)
- 【Objective-C】OC中键值编码(KVC的概念和使用方法
- obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用