iOS-KVC详解
定义:(Key-Value-Coding)键值编码(间接访问对象属性的机制,以字符串的形式向对象发送消息)
一种使用字符串而不是访问器去访问一个对象实例变量的机制,使用这个机制不需要调用set或者get方法来访问成员变量,它是通过setValue:forKey:和valueForKey:方法。
①案例
简单路径:对对象的属性进行赋值和取值
复杂路径:对对象属性的属性进行赋值和取值
KVC 相当于Set和Get方法(键值配对),能够对对象的属性进行赋值和取值:
People * p1 = [[People alloc] init]; p1.car.name = @"自行车"; //赋值 //简单路径 [p1 setValue:@"刘备" forKey:@"_name"]; //复杂路径 [p1 setValue:@"三轮车" forKeyPath:@"_car.name"]; //取值 NSString * name = [p1 valueForKey:@"_name"];
②KVC 只能对_name进行取值和赋值(_name和name都存在)
Man * man = [[Man alloc] init]; [man setValue:@"亚当" forKey:@"name"]; NSLog(@"01%@",man.description);//此时只输出_name [man setValue:@"女娲" forKey:@"_name"]; NSLog(@"02%@",man.description);//此时只输出_name
③如果没有_name的属性,但是有name这个属性的情况下,可以通过KVC对实例变量_name进行赋值和取值
Woman * woman = [[Woman alloc] init]; [woman setValue:@"夏娃" forKey:@"name"]; NSLog(@"%@",woman.description);
总结: 实例变量(属性)
/* 规则: 赋值: 1.先找set方法,如果没有呢?就找_name 2.如果没有_name,找name 3.如果没有name,那么就会崩溃 取值: 1.先找get, 如果没有get 就找_name; 2.如果没有_name,找name 3.如果没有name,就会崩溃 */
缺点:如果key写错时,编译时不会报错,运行时会报错。