iOS Runtime之KVC
2022-06-26 本文已影响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:的原理
- valueForKey:的原理
答疑
给不存在的属性赋值,会怎么样?
- 会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.'