KVC(Key Value Coding)--键值编码:是间接访问实例变量的方式。指的是在iOS的开发中可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这是iOS开发中的黑魔法之一。
使用KVC为对应的实例变量赋值的过程调用setValue:forKey:
赋值原理:给定一个key(字符串),比如name:
(1)先查对象中是否存在对应的setName:方法,如果有调用该方法为实例变量赋值,否则转第二步
(2)查对象中是否存在对应的_name的实例变量,如果有直接取出该实例变量,否则转步奏(3)
(3)查找对象中有没有对应的实例变量叫做name,如果有直接为实例变量赋值,否则转步奏(4)
(4)自动调用对象中的方法: setVAlue:forUndefinedKey:,将没有找到的键输出
KVC取值过程原理:valueForKey:,给定一个键key比如name:
(1)先查对象中是否存在对应的getter:方法,如果有直接调用,返回实例变量的内容,否则转第二步
(2)查对象中是否存在对应的_name的实例变量,如果有直接返回实例变量的内容,否则转第三步
(3)查找对象中有没有对应的实例变量叫做name,如果有直接返回实例变量的内容,否则转步骤4
(4)系统自动调用valueForUndefinedKey:,方法询问应该返回何种类型的对象
Demo
main.m
//
// main.m
// WSKVC
//
// Created by ws on 15/9/23.
//
#import <Foundation/Foundation.h>
#import "Nurse.h"
#import "Sick.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个小护士
Nurse *nurse = [[Nurse alloc]init];
[nurse setValue:@"tt" forKey:@"name"];
[nurse setValue:@"女" forKey:@"gender"];
[nurse setValue:@90 forKey:@"age"];
[nurse ws_intrduction];
//创建一个病人对象
Sick *sick = [[Sick alloc]init];
[nurse setValue:sick forKey:@"sick"];
[nurse setValue:@"gg" forKeyPath:@"sick.name"];
[nurse setValue:@"男" forKeyPath:@"sick.gender"];
[nurse setValue:@90 forKeyPath:@"sick.age"];
[sick ws_intrduction];
/**
KVC获取实例变量的内容
*/
NSString *nurseName = [sick valueForKey:@"name"];
NSLog(@"%@",nurseName);
NSString *sickName = [sick valueForKeyPath:@"sick.name"];
NSLog(@"%@",sickName);
}
return 0;
}
Nurse.h
//
// Nurse.h
// WSKVC
//
// Created by ws on 15/9/23.
//
#import <Foundation/Foundation.h>
@class Sick;
@interface Nurse : NSObject{
NSString *_name;
NSString *_gender;
NSNumber *_age;
Sick *_sick;//存储一个病人对象
}
-(void)ws_intrduction;
@end
Nurse.m
//
// Nurse.m
// WSKVC
//
// Created by ws on 15/9/23.
//
#import "Nurse.h"
#import "Sick.h"
@implementation Nurse
-(void)ws_intrduction{
NSLog(@"%@ %@ %@", _name,_gender,_age);
}
//KVC赋值过程中如果没有发现某个key,该方法会被系统自动调用,输出没有发现的key和key对应的value值
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"------%@--%@",value ,key);
}
//KVC取值过程中如果没有发现某个key,该方法会被系统自动调用,询问需要返回什么对象,一般返回nil
-(id)valueForUndefinedKey:(NSString *)key{
//nil:代表OC中的空对象
return nil;
}
@end
Sick.h
//
// Sick.h
// WSKVC
//
// Created by ws on 15/9/23.
//
#import <Foundation/Foundation.h>
@interface Sick : NSObject{
NSString *_name;
NSString *_gender;
NSNumber *_age;
}
-(void)ws_intrduction;
@end
Sick.m
//
// Sick.m
// WSKVC
//
// Created by ws on 15/9/23.
//
#import "Sick.h"
@implementation Sick
-(void)ws_intrduction{
NSLog(@"%@ %@ %@",_name,_gender,_age);
}
@end