概念:
KVC(键值编码)是一种间接访问对象是实例变量的机制,该机制可以不通过存储方法就可以访问对象的实例变量
1,KVC可以设置改变系统控件只读属性
//UITabBar的属性是readOnly,我们不能直接自定义控件和改变系统taBar WBUITabBar *tabbar = [[WBUITabBar alloc] init]; [self setValue:tabbar forKeyPath:@"tabBar"];
2,keyPath和key的区别
//简单情况下,是没有区别的 [p.dog setValue:@"wangcai" forKey:@"name"]; [p.dog setValue:@"larry" forKeyPath:@"name"]; //复杂情况下,key不能读取下一层属性 [p setValue:@"hashiqi" forKeyPath:@"dog.name"]; [p setValue:@"hashiqi" forKey:@"dog.name"]; // 写法错误XXXXXXXXXXXXX forKeyPath包含了forKey的功能,以后使用forKeyPath就可以了 forKeyPath中可以利用.运算符, 就可以一层一层往下查找对象的属性
3,利用KVC快速将属性值添加到数组
Person *p = [[Person alloc] init];
Book *book1 = [[Book alloc] init];
book1.name = @"5分钟突破iOS开发";
book1.price = 10.5;
Book *book2 = [[Book alloc] init];
book2.name = @"5分钟突破android开发";
book2.price = 18.5;
Book *book3 = [[Book alloc] init];
book3.name = @"5分钟突破前端开发";
book3.price = 20.5;
Book *book4 = [[Book alloc] init];
book4.name = @"5分钟突破PHP开发";
book4.price = 10.5;
p.books = @[book1, book2, book3, book4];
//普通方法
// 获得所有的书名(将所有的书名放到一个数组中)
NSMutableArray *names = [NSMutableArray array];
for (Book *book in p.books) {
[names addObject:book.name];
}
//高效方法
// 取出books数组中每一个元素的name属性值,放到一个新的数组中返回
NSArray *names = [p valueForKeyPath:@"books.name"];
NSLog(@"%@", names);
4,利用KVC获得的数值进行简单运算
NSNumber *avgNumber = [p valueForKeyPath:@"books.@avg.price"]; NSNumber *sumNumber = [p valueForKeyPath:@"books.@sum.price"];
原文:http://my.oschina.net/u/2346786/blog/492042