KVC (Key -Value -coding )键值编码
是一种间接地访问对象实例变量的机制
通过setValue: forKey :间接地为对象的实例变量做赋值
通过valueForKey:间接地取到对象的实例变量
首先定义两个类Person类 和phone类
赋值流程:
//1.先检查有没有name这个实例变量
//2.如果没有,会检查同名的带_的实例变量
//3.如果还没有,会自动调用setValueForUndefinedKey:这个方法
Person *per = [[Person alloc] init];
[per setValue:@"shuai" forKey:@"na"];
标题 ##取值的过程
//1.先检查有没有name这个实例变量
//2.如果没有,检查有没有同名带_的实例变量
//3.如果没有,就会自动调用valueUndefinedKey:这个方法
NSLog(@"%@",[per valueForKey:@"name1"]);
[per setValue:@18 forKey:@"age"];
NSLog(@"%@",[per valueForKey:@"age"]);
Phone *phone = [[Phone alloc] init];
//[phone setValue:@"ipone" forKey:@"brand"];
[per setValue:phone forKey:@"phone"];
NSLog(@"%@",[per valueForKey:@"phone"]);
// NSLog(@"%@",[phone valueForKey:@"brand"]);
//通过per为手机的品牌名赋值
//setValueForkeyPath
//给人的手机下地品牌赋值
[per setValue:@"huawei" forKeyPath:@"phone.brand"];
NSLog(@"%@",[phone valueForKey:@"brand"]);
NSLog(@"%@",[per valueForKeyPath:@"phone.brand"]);
// setValuesForKeysWithDictionary:<#(NSDictionary *)#>
// insert code here...
NSLog(@"Hello, World!");
//使用数组管理图书
NSMutableArray *bookArr = [[NSMutableArray alloc] initWithCapacity:1];
Book *book1 = [[Book alloc] initWithName:@"三国演义" price:20];
Book *book2 = [[Book alloc]initWithName:@"西游记" price:18];
Book *book3 = [[Book alloc ] initWithName:@"水浒传" price:21];
Book *book4 = [[Book alloc] initWithName:@"红楼梦" price:25];
//tianjia
[bookArr addObject:book1];
[bookArr addObject: book2];
[bookArr addObject:book3];
安全处理
赋值时Key 不存在时会自动调用该方法
//防止KVC赋值时,由于key不存在导致崩溃,通常用于错误处理
- (void) setValue:(id)value forUndefinedKey:(NSString *)key {
NSLog(@"forUNdefined");
//NSLog(@"%@",key);这是举例,如果这儿不写将会自动过滤不存在的key值
if ([key isEqualToString:@"na"]) {
_name = value;
}