iOS Runtime之KVC

源码 2024-9-7 02:27:22 51 0 来自 中国
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)setValueid)value forKeyPathNSString *)keyPath;
    • - (void)setValueid)value forKeyNSString *)key;
    • - (id)valueForKeyPathNSString *)keyPath;
    • - (id)valueForKeyNSString *)key;

  • 调用方式
-(void)testKVO2{    self.test = [KVOTest new];        [self.test setValue(10) forKey"age"];    NSKeyValueObservingOptions option = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;    [self.test addObserver:self forKeyPath"age" optionsption 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,0x600001ce84702022-06-25 22:25:06.887835+0800 StudyApp[31993:1358988] 20实现原理

网上对于这块的解说比力多,我就不重复形貌了,转载两个比力好形貌该原理的流程图。

  • setValue:forKey:的原理


  • valueForKey:的原理
2.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.'
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 19:29, Processed in 0.165489 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表