精华内容
参与话题
问答
  • KVC

    2020-03-04 23:47:07
    KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性 KVC主要用到的方法 // 赋值方法 - (void)setValue:(id)value forKey:(NSString *)key; - (void)setValue:(id)value forKeyPath:...

    KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

    KVC主要用到的方法

    //	赋值方法
    - (void)setValue:(id)value forKey:(NSString *)key;
    - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
    //	取值方法
    - (id)valueForKey:(NSString *)key;
    - (id)valueForKeyPath:(NSString *)keyPath;
    //	找不到key、keyPath时调用方法
    - (id)valueForUndefinedKey:(NSString *)key
    

    KVC赋值的流程

    在这里插入图片描述

    KVC取值的流程

    在这里插入图片描述

    示例代码

    @interface TBStudent : NSObject
    
    @property (nonatomic, assign) int number;
    
    @end
    
    @implementation TBStudent
    
    @end
    
    @interface TBPerson : NSObject
    {
        @public
        NSString *name;
    }
    
    @property (nonatomic, strong) TBStudent *student;
    
    @end
    
    @implementation TBPerson
    
    - (void)willChangeValueForKey:(NSString *)key{
        [super willChangeValueForKey:key];
        NSLog(@"willChangeValueForKey:%@",key);
    }
    
    - (void)didChangeValueForKey:(NSString *)key{
        NSLog(@"didChangeValueForKey:%@ --- begin",key);
        [super didChangeValueForKey:key];
        NSLog(@"didChangeValueForKey:%@ --- end",key);
    }
    
    // 默认返回YES
    + (BOOL)accessInstanceVariablesDirectly{
        return YES;
    }
    
    @end
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        TBPerson *person = [[TBPerson alloc] init];
        person->name = @"11";
        //  如果要使用keyPath赋值,必须要初始化才有效
        person.student = [[TBStudent alloc] init];
        //  添加KVO
        NSKeyValueObservingOptions options = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;
        [person addObserver:self forKeyPath:@"name" options:options context:nil];
        //  KVC赋值
        [person setValue:@"22" forKey:@"name"];
        [person setValue:@33 forKeyPath:@"student.number"];
        //  KVC取值
        NSLog(@"TBPerson -- name:%@",[person valueForKey:@"name"]);
        NSLog(@"TBStudent -- number:%@",[person valueForKeyPath:@"student.number"]);
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
        NSLog(@"监听到%@的%@属性由%@变化为%@",object,keyPath,change[NSKeyValueChangeOldKey],change[NSKeyValueChangeNewKey]);
    }
    
    @end
    
    //	打印结果
    KVC[85973:4686513] willChangeValueForKey:name
    KVC[85973:4686513] didChangeValueForKey:name --- begin
    KVC[85973:4686513] 监听到<TBPerson: 0x600001a9c2c0>的name属性由11变化为22
    KVC[85973:4686513] didChangeValueForKey:name --- end
    KVC[85973:4686513] TBPerson -- name:22
    KVC[85973:4686513] TBStudent -- number:33
    
    ============================== 补充 ==============================
    1、KVC赋值的过程猜测
    	1.1[self willChangeValueForKey:@"name"];
    	1.2、修改成员变量的值
    	1.3[self didChangeValueForKey:@"name"];
    		1.3.1、didChangeValueForKey:方法里面做的操作(通知监听器)
    			  [observe observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];
    ** 由KVC的赋值过程可以判断 --- 通过KVC修改属性(成员变量)的值是会触发KVO的;
    	
    
    PS 此文为学习 李明杰 老师的 iOS底层原理课程 所写笔记
    展开全文
  • kvc

    2019-09-25 05:00:46
    KVC,即:Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制,它是很多技术的基础。 主要的方法就两个,setValue:forKey,valueForKey 在Programming Guide中说,使用KVC可以简化代码,但事实上...

    KVC,即:Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制,它是很多技术的基础。

    主要的方法就两个,setValue:forKey,valueForKey

    Programming Guide中说,使用KVC可以简化代码,但事实上使用起来,还是要看具体情况。

    代码实例:

    1.首先定义两个DataModel,这种DataModel定义是无法访问属性的

     

    @interface BookData : NSObject {  

        NSString * bookName;  

        float price;  

        AuthorData * author;  

    }  

    @end  

    @implementation BookData  

    @end  

     

    @interface AuthorData : NSObject {  

        NSString * name;  

    }  

    @end  

    @implementation AuthorData  

    @end  

     

    2.使用KVC

     

     

    BookData * book1 = [[BookData alloc] init];  

    [book1 setValue:@"english" forKey:@"bookName"];  

    [book1 setValue:@"20.0" forKey:@"price"];  

    AuthorData * author1 = [[AuthorData alloc] init];  

    [author1 setValue:@"tom" forKey:@"name"];  

    [book1 setValue:author1 forKey:@"author"];  

      

    NSLog(@"value=%@",[book1 valueForKey:@"bookName"]);  

    NSLog(@"price=%f",[[book1 valueForKey:@"price"] floatValue]);  

    NSLog(@"author=%@",[book1 valueForKeyPath:@"author.name"]);  

    [book1 release];  

     

    转载于:https://www.cnblogs.com/zhibin/p/4122891.html

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 3,817
精华内容 1,526
关键字:

kvc