您的位置:首页 > 其它

关于KVC的介绍及使用---Cocoa中的大招

2015-11-10 00:18 423 查看
#import <Foundation/Foundation.h>

@interface BTCar:NSObject

@property (nonatomic,assign)CGFloat price;

@end

@implementation BTCar

@end

@interface BTPerson : NSObject

@property (nonatomic,strong) BTCar* car;

@property (nonatomic,copy) NSString* name;

@property (nonatomic,assign) NSInteger age;

@end

@implementation BTPerson

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

BTPerson* person = [[BTPerson alloc] init];

person.name = @"Hello";

person.age = 12;

person.car = [[BTCar alloc] init];

NSString* name = [person valueForKey:@"name"];

NSLog(@"%@",name);

[person setValue:[NSNumber numberWithInt:23] forKey:@"age"];

NSLog(@"%ld",person.age);

[person setValue:[NSNumber numberWithFloat:300000] forKeyPath:@"car.price"];

NSLog(@"%@",[person valueForKeyPath:@"car.price"]);

BTPerson* person1 = [[BTPerson alloc] init];

person1.name = @"world";

NSArray* dataArray = @[person,person1];

NSArray* array = [dataArray valueForKeyPath:@"name"];

NSLog(@"%@",array);

NSDictionary* dict = @{@"name":@"kitty",@"age":@11};

BTPerson*person2 = [[BTPerson alloc] init];

[person2 setValuesForKeysWithDictionary:dict];

NSLog(@"%@,%ld",person2.name,person2.age);

}

return 0;

}

/*

键/值编码(key-value coding)是一种间接更改对象状态的方式,也称为KVC,是Cocoa提供的一种特性,其实现方法是使用字符串

表示要更改的对象状态。

键/值编码中的基本调用是- (id)valueForKey:(NSString *)key;和- (void)setValue:(id)value forKey:(NSString *)key方法。你可以向对象发送消息,并传递你想要访问的属性名称的键作为参数。

NSString* name = [person valueForKey:@"name"]; valueForKey功能非常强大,它可以找到name属性的值,并将其返回。它会首先寻找以name命名的getter方法,如果没有这样的getter方法,它会去寻找格式为_name或者name的实例变量

最后非常重要的一点是,-valueForKey在Objective-C运行时钟使用元数据打开对象并进入其中查找需要的信息。在C和C++语言中不能执行这样的操作。通过使用KVC,没有相关的getter方法也能获取对象值。不需要通过对象指针来直接访问实例变量。

[person setValue:[NSNumber numberWithInt:23] forKey:@"age"];setValueForKey自动会将23从NSNumber对象中取出来。

*/

/*

键/值编码还支持指定路径,- (nullable id)valueForKeyPath:(NSString *)keyPath;和- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;方法。

如何表示键路径呢?可以在对象和不同的变量名称之间用圆点分开。

[person setValue:[NSNumber numberWithFloat:300000] forKeyPath:@"car.price"];

NSLog(@"%@",[person valueForKeyPath:@"car.price"]);

car.price表示键路径 Person的car属性的price属性

这些键路径的深度是任意的,可以使用如car.tire.price这样的形式

*/

/*

整体操作:

如果使用一个键值访问一个NSArray数组,它实际上会查询相应数组中的每个对象,然后将查询结果打包到另一个数组,并将其返回。这种方式同样适用于通过路径访问位于对象中的数组。

NSArray* array = [dataArray valueForKeyPath:@"name"];

它将会遍历数组中的每一个对象,并将name键所对应的值打包成一个数组返回。

*/

/*

BTPerson*person2 = [[BTPerson alloc] init];

[person2 setValuesForKeysWithDictionary:dict];

NSLog(@"%@,%ld",person2.name,person2.age);

setValuesAndKeysWithDictionary:用字典中的数值为对象的属性赋值

在字典转模型中经常用到这个

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