iOS Runtime之KVC

Runtime系列导读

  • iOS Runtime之方法查找
  • iOS Runtime之方法替换
  • iOS Runtime之KVO
  • iOS Runtime之KVC
  • iOS 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: '[ 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: '[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key age1.'

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