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

目录
相关文章
|
1月前
|
安全 Swift 开发者
【Swift开发专栏】Swift类的继承与多态
【4月更文挑战第30天】Swift中的OOP聚焦于类继承与多态,提供代码复用和类型安全。继承通过`class`和冒号实现,子类继承父类属性和方法,支持单继承以降低复杂性。多态借助协议和类型兼容实现,允许统一处理不同类型的对象。继承用于构建复杂类,多态则使代码更通用、可扩展。理解并运用这些概念对Swift开发者至关重要。
|
存储 算法 iOS开发
|
存储 Swift
Swift实用小册14:Destructor析构函数的使用
析构函数,也叫析构器。 它是在对象销毁的时候自动调用,完成实例清理工作以释放资源的函数。 在Swift语言中,我们使用Initializer构造函数,在实例初始化时调用,以实现初始化的业务场景。
159 0
Swift实用小册14:Destructor析构函数的使用
|
前端开发 Swift
Swift实用小册10:实例方法和类型方法的使用
Swift实用小册10:实例方法和类型方法的使用
191 0
Swift实用小册10:实例方法和类型方法的使用
|
C语言 iOS开发
OC 底层知识(二): KVO
OC 底层知识(二): KVO
165 0
OC 底层知识(二): KVO
|
API
OC底层知识(五) :关联对象
OC底层知识(五) :关联对象
269 0
OC底层知识(五) :关联对象
|
存储 iOS开发 C++
OC 底层知识(一):OC的本质
OC 底层知识(一):OC的本质
213 0
OC 底层知识(一):OC的本质
|
监控 API iOS开发
OC底层知识(十) : RunLoop
OC底层知识(十) : RunLoop
278 0
OC底层知识(十) : RunLoop
|
iOS开发
OC中的内省方法(Introspection)
OC中的内省方法(Introspection)
134 0
|
存储 JSON 算法
Swift 与 OC 枚举的异同
Swift 与 OC 枚举的异同
Swift 与 OC 枚举的异同