OC底层知识(三): KVC

简介: OC底层知识(三): KVC
  • 1、KVC简单介绍


  • KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性。KVC的基础知识


  • 2、常见的API


- (id)valueForKeyPath:(NSString *)keyPath; // 最外层的属性赋值(带路径)
- (id)valueForKey:(NSString *)key;  // 最外层的属性取值(带路径)
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath; // 其他层的属性赋值
- (void)setValue:(id)value forKey:(NSString *)key; // 其他层的属性取值
  • 3、简单的使用


  • JKPerson继承于NSObject,JKDog继承于NSObject, 在JKPerson定义一个属性@property(nonatomic,strong) JKDog *dog;


JKPerson *person = [[JKPerson alloc]init];
[person setValue:@12 forKey:@"height"];
person.dog = [[JKDog alloc]init];
[person setValue:@20 forKeyPath:@"dog.age"];
NSLog(@"height的值 ==== %@  dog.age ==== %@",[person valueForKey:@"height"],[person valueForKe


4、setValue:forKey(设置值):的原理


image.png



  • setValue:forKey:->按照setKey:、_setKey:顺序查找方法


  • 找到方法:传递参数,调用方法
  • 没有找到方法:查看accessInstanceVariablesDirectly(能不能直接访问成员变量)方法的返回值
  • 返回YES(允许直接访问成员变量):按照_key_isKeykeyisKey顺序查找成员变量,找到了成员变量:直接赋值,没找到成员变量:调用setValue:forUndefinedKey:
    并抛出异常NSUnknownKeyException
  • 返回NO(不允许直接访问成员变量):调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException


  • 5、通过KVC修改属性会触发KVO吗?


  • 答案:会触发KVO


image.png

6、KVC修改属性会触发KVO的底层原理是什么?

image.png

JKObserve *jkObserve = [[JKObserve alloc]init];
JKPerson *person = [[JKPerson alloc]init];
[person addObserver:jkObserve forKeyPath:@"height" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew  context:NULL];
[person setValue:@12 forKey:@"height"];
 /*
   [person willChangeValueForKey:@"height"]; // 将要改变height的值
   person -> _height; // 赋值
   [person didChangeValueForKey:@"height"];  // 调用KVO的监听方法
  */
 NSLog(@"height == %@",[person valueForKey:@"height"]);
 [person removeObserver:jkObserve forKeyPath:@"height"];


  • 7、valueForKey(取值):的原理?


image.png

JKPerson *user = [[JKPerson alloc]init];
 user->_height = 10;
 NSLog(@"取出的值==%@", [user valueForKey:@"height"]);
 @interface JKPerson : NSObject
 {
    @public
    int height;
    int isHeight;
    int _isHeight;
    int _height;
 }
 -(int)getHeight{
     return 20;
 }
 -(int)height{
     return 21;
 }
 -(int)isHeight{
     return 22;
 }
 -(int)_height{
     return 23;
 }


KVC底层练习的demo

目录
相关文章
|
存储 算法 安全
C#三十二 泛型的理解和使用
C#三十二 泛型的理解和使用
40 0
【JavaSE】Java基础语法(三十一):可变参数
1. 可变参数 可变参数介绍 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了 方法的参数类型已经确定,个数不确定,我们可以使用可变参数
|
C语言 iOS开发
OC 底层知识(二): KVO
OC 底层知识(二): KVO
197 0
OC 底层知识(二): KVO
|
iOS开发
OC:跟随小码哥一起学习KVC
KVC 全拼 key-value-coding,翻译过来即为 键值编码 。可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的
167 0
OC:跟随小码哥一起学习KVC
|
存储 iOS开发 C++
OC 底层知识(一):OC的本质
OC 底层知识(一):OC的本质
256 0
OC 底层知识(一):OC的本质
|
API
OC底层知识(五) :关联对象
OC底层知识(五) :关联对象
317 0
OC底层知识(五) :关联对象
|
监控 API iOS开发
OC底层知识(十) : RunLoop
OC底层知识(十) : RunLoop
313 0
OC底层知识(十) : RunLoop
|
安全 Unix 程序员
OC底层知识(十一) : 多线程
OC底层知识(十一) : 多线程
211 0
OC底层知识(十一) : 多线程
|
存储 安全 编译器
OC底层知识(十二) : 内存管理
OC底层知识(十二) : 内存管理
204 0
OC底层知识(十二) : 内存管理
|
iOS开发
OC中的内省方法(Introspection)
OC中的内省方法(Introspection)
167 0