iOS Runtime之KVC

2022-06-26  本文已影响0人  谢二九

Runtime系列导读

简介

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

用法

-(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

实现原理

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

image.png image.png

答疑

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

[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.'

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

[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.'
上一篇下一篇

猜你喜欢

热点阅读