kvo与kvc

作者: Gzook | 来源:发表于2016-07-06 15:21 被阅读21次

    kvo:key value observing

    键值观察机制

    通过kvo检测对象属性值的变化。
    每次被观察的对象的属性发生改变时,kvo会自动的通知相应的观察者

    使用步骤:
    1 注册监听的对象,指定被观察对象的属性
    2 实现回调方法。在观察者的类中实现回调方法,一旦被观察对象的属性发生改变,就会自动调用该回调方法
    3 移除观察,解除监听对象

    1.注册,添加观察者(用被观察者调用该方法)
    /*
    参数一:观察者
    参数二:被观察的对象的属性
    参数三:指定监听的操作,比如新值、初始化等
    参数四:上下文,一般为nil,当keyPath相同时,可以设置不同的字符串用于区分
    */
    [person.card addObserver:person forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    2.实现回调方法
    #pragma mark - 2.实现回调方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"keyPath:%@,观察的对象 %@,改变的信息%@",keyPath,object,change); }
    3.回收方法
    - (void)dealloc{
    [self.person removeObserver:self.person forKeyPath:@"money"];
    }

    kvc : key value coding键值编码

     通过kvc对对象的属性进行间接的取值和赋值 不再使用访问器的方法
     */
    Student *stu=[[Student alloc]init];
    StuClass *stuClass=[[StuClass alloc]init];
    
    //通过访问器的方法设置属性值
    stu.num=1;
    stu.name=@"apple";
    
    stuClass.num=1;
    stuClass.name=@"iOS";
    stu.stuClass=stuClass;
    
    //通过访问器的方法获取属性值
    NSLog(@"学生的 学号%i,姓名%@,班级编号:%li,班级名称:%@",stu.num,stu.name,(long)stu.stuClass.num,stu.stuClass.name);
    
    //kvc
    [stu setValue:@1 forKey:@"num"];
    [stu setValue:@"apple" forKey:@"name"];
    [stu setValue:stuClass forKey:@"stuClass"];
    
    //kvc使用keyPath时,用点连接属性名
    [stu setValue:@1 forKeyPath:@"stuClass.num"];
    [stu setValue:@"java" forKeyPath:@"stuClass.name"];
    
    //对不存在的属性赋值,会报错
    //解决方法:去对象的类中重写setValue:forUndefinedKey:
    [stu setValue:@21 forKey:@"age"];
    
    kvc方法取值
    int num=[[stu valueForKey:@"num"]intValue];
    NSString *name=[stu valueForKey:@"name"];
    
    int c_num=[[stu valueForKeyPath:@"stuClass.num"]intValue];
    NSString *c_name=[stu valueForKeyPath:@"stuClass.name"];
    
        NSLog(@"学生的 学号%i,姓名%@,班级编号:%i,班级名称:%@",num,name,c_num,c_name);
    //数组
    NSMutableArray * temArray=[NSMutableArray array];
    for (int i=0; i<10; i++) {
        Test * test=[[Test alloc] init];
        [test setValue:@(100-arc4random()%10*2) forKey:@"score"];
        [temArray addObject:test];
    }
    [stu setValue:temArray forKey:@"testArray"];
    [stu showTestInfo];

    相关文章

      网友评论

          本文标题:kvo与kvc

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