美文网首页
KVC与KVO的理解

KVC与KVO的理解

作者: 陌巷先森 | 来源:发表于2019-02-28 10:06 被阅读0次

    一、KVC

    KVC即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用setter、getter方法访问。其实现方法有两种:

    • 使用字符串来描述对象需要更改的属性
    //通过键值对来为对象属性赋值,主要为私有属性赋值
    Student *stu = [Student new];
     [stu setValue:@"KVC" forKey:@"name"];
    //通过键值对取得对象属性的值
    NSString *name = [stu valueForKey:@"name"];
    
    • 使用键值对路径来描述对象需要修改的属性,keyPath就是用.号把一个个的key链接起来,根据路径进行访问
    //如果对象A的属性是对象B,要为对象B的属性赋值可以通过键值对路径
    _student = [Student new];
    [self setValue:@"KVCPath" forKeyPath:@"student.name"];
    //通过键值对路径获取对象B属性的值
    NSString *pathName = [self valueForKeyPath:@"student.name"];
    
    • 可以将字典转模型
    //可以通过字典进行赋值,将字典转换成模型
    NSDictionary *dic = @{
                              @"name":@"luna",
                              @"city":@"Beijing",
                              };
    Person *p = [Person new];
    [p setValuesForKeysWithDictionary:dic];
    

    二、KVO

    1.KVO介绍
    KVO(Key-Value Observing)建立在KVC之上,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法,从而进行一些操作。
    2.KVO原理
    KVO通过创建一个当前类的派生类,重写该对象的setter方法,并且在setter方法中实现通知机制。通过修改当前类的isa指针,让其指向派生类。当调用setter方法时就会调用派生类的setter方法,从而激活键值通知机制。此外派生类还重写了delloc方法来释放资源。
    3.KVO使用

    /*
    1.注册观察者
    第一个参数是观察者对象,第二个参数是观察的键值路径,第三个参数是当值更新时返回的选项,第四个参数是文本内容
    */
    [_student addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    
    /*
    2.实现回调方法
    */
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
        NSLog(@"KVO---keyPath:%@,object:%@,change:%@",keyPath,object,change);
    }
    
    /*
    3.在不需要时移除观察者
    */
    [_student removeObserver:self forKeyPath:@"name"];
    

    参考:完整项目资料下载

    相关文章

      网友评论

          本文标题:KVC与KVO的理解

          本文链接:https://www.haomeiwen.com/subject/deqmlftx.html