您的位置:首页 > 其它

KVC

2015-07-21 19:59 281 查看

什么是KVC

KVC指的就是NSKeyValueCoding非正式协议

KVC是一种间接地接受访问对象的属性机制

这种间接表现在通过字符串来标示属性,而不是通过调用来存取方法或直接地访问实例变量的方式。KVC机制不仅支持对象,还支持标量和结构体类型,这些非对象的类型会被自动的装箱和开箱

Key & Key Path

键(Key)是一个字符串用来标识对象里面的一个指定的属性。一般一个键对应对象的存取方式或实例变量。键必须是ASCII码,一般以小写字母开始,不能包含空格。

键路径(Key Path)是一个由点进行分割的一系列键组成的字符串

KVC的使用

(1)获取值

- (id)valuewForKey:(NSString *)key   传入NSString属性的名字。

- (id)ValueForKeyPath:(NSString *)keyPath   传入NSString属性的路径,形式为 xx.xx。

- (id)valueForUndefinedKey:(NSString *)key    默认实现是抛出异常,可以重写这个函数左错误处理。


(2)修改值

- (void)setValue:(id)value forKey:(NSString *)key

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath

- (void)setNilValueForKey:(NSString *)key  当对非类对象属性设置nil时,调用,默认抛出异常。


(3)一对多关系成员的情况

mutableArrayValueForKey: 有序一对多关系成员 NSArray

mutableSetValueForKey: 无序一对多关系成员 NSSet

注意:

KVC与点语法是正交的,就是说与点语法没有任何关系

The accessor patterns are written in the form -set :or-

KVC在集合中的使用

@avg(求属性的平均值)其中transactions为对象数组

NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];


@count

NSNumber *numberOfTransactions = [transactions valueForKeyPath:@"@count"];


@max

NSDate *latestDate = [transactions valueForKeyPath:@"@max.date"];


@min

NSDate *earliestDate = [transactions valueForKeyPath:@"@min.date"];


@sum

NSNumber *amountSum = [transactions valueForKeyPath:@"@sum.amount"];




代码说明

Peroson.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *sex;//定义了一个私有成员变量
}
@property (nonatomic, strong) NSString *name;
@property (nonatomic)NSInteger age;

@end


main.h

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1.-----这里的缺点就是当对象的类型不确定时,不能够自动识别对象的类型

//        id p = [[Person alloc]init];
//        p.name = @"lijinchao";//name属性不能用点(.)语法访问因为不知道它的具体类型
//        p.age = 23;
//        NSLog(@"%@",p);

//2.------这里使用KVC的优点显而易见,kvc可以自动识别对象的类型,并进行适配

//        id p = [[Person alloc] init];
//        [p setValue:@"lijinchao" forKey:@"name"];
//        [p setValue:@29 forKey:@"age"];
//        NSLog(@"%@",p);

//        Person *p = [[Person alloc] init];
//        p.sex = @"男";//这里由于sex没有被property和setter/getter进行封装.所以不能用点语法进行访问
//        p->sex = @"女";也不能用指针方式进行访问,因为没有被封装的属性是私有的,外界无法访问
//        NSLog(@"%@",p->sex);
//但是KVC却解决了这个难题
[p setValue:@"男" forKey:@"sex"];
NSLog(@"sex:%@",[p valueForKey:@"sex"]);//当然了访问私有属性的值的时候也要用KVC机制进行访问

id pero = [Person personWithName:@"lijinchao" age:34];
NSLog(@"%@",pero);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: