您的位置:首页 > 移动开发 > IOS开发

iOS KVC详解

2015-09-06 21:52 375 查看

What is KVC

KVC 即 key-value coding,是一种间接访问对象属性的机制。这种机制是使用strings 来识别属性,而不是通过调用访问器方法或者是直接访问实例变量。很多时候在应用中使用KVC,可以简化编程。

KVC Fundamental

Keys 和 Key Paths的区别

Key是一个识别对象属性的字符串,一般与接收者对象的访问器方法名和实例变量名一致。Key必须实用 ASCII编码,小写字母开头,并且不能包含空格。例如buyer,amount,openingSource。

Key path是用点隔开的key的字符串,如address.street,先得到接收者对象的address属性,再判定address对象的street属性。

取值

KVC可以用来访问三种不同类型的对象的值:attributes,to-one relationships, to-many relationships.

attribute 指简单值的属性,如标量(质量、密度)、字符串,布尔值。 Value 对象如NSNumber 和其它一些可变类如NSColor也被认为是attrubutes。

to-one relationship 的property:一对一关系的属性, 如NSView 实例的superview。

to-many relationship:一对多关系的属性:由一个相关对象的集合组成 ,如一个NSArray或NSSet通常持有这样一个集合 。

例如新建Person,Dog,Book类,在Person类中:

#import <Foundation/Foundation.h>
#import "Dog.h"

@interface Person : NSObject{
@private int _height;
}

@property (nonatomic,copy) NSString *name;  //attribute
@property (nonatomic,assign) NSInteger age; //attribute
@property (nonatomic,retain) Dog *dog;      //to-one relationship
@property (nonatomic,retain) NSArray *books;//to-many relationship

- (void)printInfo;
@end


Book类:

#import <Foundation/Foundation.h>

@interface Book : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign)float price;
@end


使用:

NSArray *books = @[b1,b2];//只能创建不可改变的数组
p1.books = books;

[p1.books enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Book *tmp = (Book *)obj;
NSLog(@"%@",tmp.name);
}];//枚举方式遍历取值

//KVC方式
NSArray *book_names = [p1 valueForKeyPath:@"books.name"];
NSLog(@"KVCbook列表%@",book_names);
//可使用KVC提供的@avg,@count,@max,@min,@sum
NSNumber *totalPrice = [p1 valueForKeyPath:@"books.@sum.price"];
NSLog(@"%@",totalPrice);

NSNumber *avgPrice   = [p1 valueForKeyPath:@"books.@avg.price"];
NSLog(@"%@",avgPrice);


改值

//根据之前提到过的,再次体悟forKey 与 forKeyPath的差异
p1.dog = d;
p1.name = @"Kerry";
[p1 setValue:@99 forKeyPath:@"height"];

d.name = @"dog";
NSLog(@"%@",p1.dog.name);
[p1 setValue:@"dog1" forKeyPath:@"dog.name"];
NSLog(@"%@",p1.dog.name);
[p1 setValue:@"dog2" forKey:@"dog.name"];//这是不可以的
/**
*当对象又引用其它对象的时候,直接给其他对象赋值必须用forKeyPath
**/
[p1.dog setValue:@"dog2" forKey:@"name" ];
NSLog(@"%@",p1.dog.name);
/**
*用KVC取值
**/
//    NSLog(@"%@",[p1 valueForKey:@"dog.name"]);
NSLog(@"%@",[p1 valueForKeyPath:@"dog.name"]);
NSLog(@"%@",[p1.dog valueForKeyPath:@"name"]);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios KVC