iOS-KVC

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

Snip20210603_1.png
main.m
//
//  main.m
//  WSKVC
//
//  Created by ws on 15/9/23.
//

#import 
#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 
@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 

@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

你可能感兴趣的:(iOS-KVC)