关于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:用字典中的数值为对象的属性赋值
在字典转模型中经常用到这个
*/
@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:用字典中的数值为对象的属性赋值
在字典转模型中经常用到这个
*/
相关文章推荐
- SVN回滚版本
- 在两个Activity之间传递IntArray(整形数组)
- 在C++工程中main函数之前跑代码的廉价方法
- hiho刷题日记——第八天状态压缩·一
- 【JMeter】ant+jmeter生成html报告
- 中通打印助手-查快递
- Android 动画AlphaAnimation类方法
- itween的使用
- ARM汇编基础
- 第一章 项目时间管理的基本概念
- 反思 = =
- oracle 的锁
- LightOJ - 1099 Not the Best(次短路)
- poj2115
- poj2115
- 专访黄勇:Java在未来的很长一段时间仍是主流
- PL\SQL如何将从一张表中选出的数据插入到另一张表中
- min函数栈解题思路分析
- Block的基本用法
- 反思自学中的误区