美文网首页
iOS Runtime之KVC

iOS Runtime之KVC

作者: 谢二九 | 来源:发表于2022-06-26 08:58 被阅读0次

    Runtime系列导读

    简介

    KVC是Key Value Coding的缩写,意思是键值编码。 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/setter方法来访问对象的属性。 用KVC可以间接访问对象属性的机制。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。

    用法

    • 常见API

      • - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
      • - (void)setValue:(id)value forKey:(NSString *)key;
      • - (id)valueForKeyPath:(NSString *)keyPath;
      • - (id)valueForKey:(NSString *)key;
    • 调用方式

    -(void)testKVO2
    {
        self.test = [KVOTest new];
        
        [self.test setValue:@(10) forKey:@"age"];
        NSKeyValueObservingOptions option = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
        [self.test addObserver:self forKeyPath:@"age" options:option context:nil];
        [self.test setValue:@(20) forKey:@"age"];
        NSLog(@"%ld", [[self.test valueForKey:@"age"] integerValue]);
    }
    
    • 打印日志
    2022-06-25 22:25:06.887730+0800 StudyApp[31993:1358988] age - {
        kind = 1;
        new = 20;
        old = 10;
    }
    2022-06-25 22:25:06.887791+0800 StudyApp[31993:1358988] didChangeValueForKey:age,0x600001ce8470
    2022-06-25 22:25:06.887835+0800 StudyApp[31993:1358988] 20
    

    实现原理

    网上对于这块的讲解比较多,我就不重复描述了,转载两个比较好描述该原理的流程图。

    • setValue:forKey:的原理
    image.png
    • valueForKey:的原理
    image.png

    答疑

    给不存在的属性赋值,会怎么样?

    • 会crash
    [self.test setValue:@(10) forKey:@"age1"]; // 产生以下crash
    
    *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<KVOTest 0x600002ed45f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key age1.'
    

    给不存在的属性取值,会怎么样?

    • 会crash
    [self.test valueForKey:@"age1"] // 产生以下Crash
    
    *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<KVOTest 0x6000033dc620> valueForUndefinedKey:]: this class is not key value coding-compliant for the key age1.'
    

    相关文章

      网友评论

          本文标题:iOS Runtime之KVC

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