KVO 和 KVC

KVC和KVO底层原理 了解更多iOS底层原理知识,关注腾讯课堂八点钟学院iOS高级开发 iOS学习交流QQ群431449751KVC和KVO想必都熟知的一个名词,采用观察者模式,那么KVC到底是个什么,KVO又是什么,它们之间是怎样关联的,一起来解决这些疑惑。像我们银行卡bankCard的余额变动,会及时通知给用户,这种场景就运用了观察者模式,达到了系统的高效高性能处理;当你了解KVC机制,会恍然大悟,只要知道一个UI 阅读详情

一,概述

KVO,即:Key-ValueObserving,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

二,使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

三,实例:

假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。

1.定义DataModel,

@interface StockData : NSObject {

   NSString * stockName;

   float price;

}

@end

@implementation StockData

@end

2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边

- (void)viewDidLoad

{

   [super viewDidLoad];

   stockForKVO = [[StockData alloc] init];

   [stockForKVO setValue:@"searph" forKey:@"stockName"];

   [stockForKVO setValue:@"10.0" forKey:@"price"];   

   [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

   myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];

   myLabel.textColor = [UIColor redColor];

   myLabel.text = [stockForKVO valueForKey:@"price"];

   [self.view addSubview:myLabel];

   UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];

   b.frame = CGRectMake(0, 0, 100, 30);

   [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];

   [self.view addSubview:b];

}

3.当点击button的时候,调用buttonAction方法,修改对象的属性

-(void) buttonAction

{

   [stockForKVO setValue:@"20.0" forKey:@"price"];

}

4. 实现回调方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

   if([keyPath isEqualToString:@"price"])

    {

      myLabel.text = [stockForKVO valueForKey:@"price"];

    }

}

5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者

- (void)dealloc

{

   [super dealloc];

   [stockForKVO removeObserver:self forKeyPath:@"price"];

   [stockForKVO release];

}

 

四,小结

KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。

KVC

 

一,概述

KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。

 

当使用KVO、CoreData、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。

二,使用方法

关键方法定义在:NSKeyValueCodingprotocol

KVC支持类对象和内建基本数据类型。

  获取值

valueForKey:,传入NSString属性的名字。

valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

  修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。

  一对多关系成员的情况

mutableArrayValueForKey:有序一对多关系成员 NSArray

mutableSetValueForKey:无序一对多关系成员  NSSet

三,实例:

1.    1 .Person类 

2.    @implementation Person 

3.    @synthesize name,age;//属性name 将被监视 

4.    -(void) changeName 

5.    { 

6.        name=@"changeName directly"; 

7.    } 

8.    @end 

9.     

10.  

11. 2.PersonMonitor类  监视了name属性 

12. @implementation PersonMonitor 

13.  

14. - (void)observeValueForKeyPath:(NSString *)keyPath 

15.                       ofObject:(id)object 

16.                         change:(NSDictionary *)change 

17.                        context:(void *)context 

18. { 

19.     if ([keyPath isEqual:@"name"]) 

20.     { 

21.         NSLog(@"change happen, old:%@   new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]); 

22.     } 

23. } 

24. @end 

25.  

26.  

27. 3测试代码 

28.  

29.    //初始化被监视对象 

30.     Person *p =[[Person alloc] init]; 

31.    //监视对象 

32.    PersonMonitor *pm= [[PersonMonitor alloc]init]; 

33.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil]; 

34.    

35. //测试前的数据 

36.     NSLog(@"p.name is %@",p.name); 

37.     

38. //通过setvalue 的方法,PersonMonitor的监视将被调用 

39.   [p setValue:@"name kvc" forKey:@"name"]; 

40.   

41. //查看设置后的值 

42.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]); 

43.  

44. //效果和通过setValue 是一致的     

45. p.name=@"name change by .name="; 

46.  

47.  //通过person自己的函数来更改name  

48.      [p changeName];  

49.  

50.  结果是 

51. 输出 

52. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name 

53. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc 

54. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc 

55. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name= 

56. 最后一次修改是直接修改  所以没法产生通知

四,小结

KVO/KVC这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知

深入探索Objective-C中的KVC和KVO技术 本文还有配套的精品资源,点击获取 简介:KVC(键值编码)和KVO(键值观察)是Objective-C用于iOS和Mac OS X开发的两种关键特性,用于对象属性的动态访问和观察。本项目演示了KVC和KVO的工作原理及其应用场景,涵盖数据绑定、归档解档、动态属性访问、对象属性变化监听和通知处理等。通过这个示例,开发者可以学习如何在实践中使用KVC和KVO,并了解它们的正确用... 阅读详情

相关推荐

激光定位算法竞技场:hdl_localization与Cartographer/AMCL的横向技术解剖

本文深入对比了hdl_localization、Cartographer和AMCL三种激光定位算法的技术原理与性能表现。通过UKF-NDT融合、图优化和粒子滤波等核心技术,分析了各算法在结构化环境、动态环境和大尺度场景下的适应性。实验数据表明,Cartographer在全局一致性上表现最优,而AMCL在动态环境中更具鲁棒性。文章还提供了算法选型指南和参数调优技巧,为工程实践提供参考。

weixin_29062865的博客 365

什么是KVC和KVO?

一.KVC和KVO的概念 1> KVC:NSKeyValueCoding的简称,是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。 2> KVO:NSKeyValueObserving的简称,当指定的对象的属性被修改了,允许对象接收到通知的机制。 二.KVC介绍 1、概述 KVC是KeyValu

飞天鱼的专栏 3792

《小白入门:无人机电调 ESC 的 PWM 接口特性、主流协议与使用指南》

电调是无人机的 “动力中枢”,其 PWM 接口是入门的基础,而 SBUS、DroneCAN 等协议则代表了更高阶的控制方式。小白学习时,需先掌握 PWM 的基本特性和连接方法,再根据场景选择合适的协议,同时严格遵守使用注意事项(如电源匹配、校准步骤、安全操作)。随着实践深入,逐步理解 “协议差异” 和 “系统协同”,才能让无人机更稳定、安全地飞行。

bother3000的博客 3767

【iOS】——KVC和KVO

key的值必须正确,如果拼写错误,会出现异常。当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来。因为类可以反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去。NSArray/NSSet等都支持KVC。可以通过KVC访问自定义类型的私有成员。

m0_73974920的博客 2613

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5189

【iOS】KVC 和 KVO 的使用场景

Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor, 如我们有个property叫做foo, 我们可以foo直接访问它,同样我们也可以用KVC来完成[Object valueForKey:@“foo”], 有同学就会问了, 这样做有什

省 2万+

036、算子映射:如何将ONNX算子映射到NPU硬件指令?

《算子映射:ONNX到NPU的转换艺术》 本文深入探讨了将ONNX算子映射到NPU硬件指令的技术挑战与实践经验。作者通过真实案例揭示了映射过程中的常见陷阱,如Reshape算子被错误映射导致分类错误。文章详细分析了三种映射策略(直接映射、拆分映射和融合映射),并强调映射表在编译器中的核心作用。特别针对动态形状、精度对齐等难题提供了解决方案,分享了编写映射表时的实用铁律,包括先优化后映射、严格单元测试等。最后指出,成功的算子映射需要在数学语义、硬件约束和性能优化之间找到精确平衡,这种看似枯燥的工作实则决定着N

m0_50546716的博客 184

iOS KVC 和 KVO 的学习

KVC (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种方法 今天特地总结一下KVC 和 KVO.以方便以后深入学习与运用. 再而有了全新认识,再做更专业的总结. KVC : 一个非正式的Protocol,提供一种机制来间接访问对象的属性...

weixin_34211761的博客 1139

线性代数 --- 置换矩阵 (Permutation matrix)

置换矩阵 - permutation matrix

松下J27录放机 3万+

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

Swift中KVC和KVO的使用

原创BLog,转载请注明出处 Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是一种间接访问对象的机制 key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型 KVC主要就是两个方法 (1)通过key设置对应的属性 (2)通过key获取对应的属性 举例 class TestFor

Leo的专栏 1万+

PLC框架-1.3- 汇川PN伺服(3号报文)

本文以汇川IS620F伺服为例,详细介绍了FB_Servo_ToAxis功能块的应用方法。该功能块封装了MC_Home等轴控指令,实现使能、定位、点动、速度模式及回零等功能,支持转矩限制与显示,并具备行程统计和HMI单位自动切换特性。文章从硬件配置(PN网络连接、报文选择)、参数设置(控制模式、电子齿轮比),到软件实现(功能块调用、手动/自动控制逻辑)进行了系统说明,重点展示了绝对/相对定位、速度模式等典型应用场景的程序编写方法,为汇川伺服在Profinet网络下的工程应用提供了完整解决方案。

qq_34047402的博客 755

iOS KVC和KVO

一. KVC KVC也就是key-value-coding,即键值编码,最常见的两种用法就是: 1). 对私有变量进行赋值,同样的也可以通过它进行取值 对某一个属性进行赋值,可以不用加下划线,它的查找规则应该是:先查找和直接写入的字符串相同的成员变量,如果找不到就找以下划线开头的成员变量; [p setValue:@170 forKey:@"height"]; [p valueForKey:@"height"]; forKeyPath是包含了 forKey这个方法的功能的,甚至 forKeyPath

春风酿酒的博客 1114

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS KVC和KVO详解

KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。 在实现了访问器方法的类中,使用点语法和KVC访问...

wangletiancsdn的博客 409

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS KVC和KVO介绍

KVC:键值编码,使用字符串的方式管理对象的成员、属性 KVO:键值监听,一种观察者模式,监听属性的改变,可实现UI和数据模型的分离,基于KVC。

LOLITA0164的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

KVC和KVO

1、KVC的基本用法: KVC是KeyValue Coding的简称,它是一种可以直接通过字符串的名字来访问属性的机制。使用该机制不需要调用存取方法和变量实例就可以访问对象属性。本质上讲,键-值编码定义了你的程序存取方法需要实现的样式以及方法签名。 键-值编码方法在OC非标准协议(类目)NSKeyValueCoding中被声明,默认的实现方法有NSObject提供。 键-值编码支持带有对象值

zddhaha的专栏 538

探索KVC和KVO的本质

原文链接: 探索KVC和KVO的本质 这篇文章主要介绍KVO和KVC, 机器底层是如何实现的 KVO的全称是Key-Value Observing,俗称键值监听,可以用于监听某个对象属性值的改变 KVO是使用获取其他对象的特定属性变化的通知机制,控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的 对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器并更新用...

RunningKing 379

KVC 和KVO

1)KVC概念    Key-Value Coding,即键值编码。它是一种不通过存取方法,而通过属性名称字符串间接访问属性的机制。  1.  赋值方法: - (void)setValue:(id)value forKey:(NSString *)key; 2.获取属性的方法: - (id)valueForKey:(NSString *)key; 3.通过path获取多层级的属性,比如:stude...

u011118092的博客 294

KVC 和 KVO

Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制。在这篇文章里,我们将接触一些如何利用这些特性的例子。 观察 model 对象的变化 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步。这一共有两...

ddxp9097的博客 344

OC中的KVC和KVO

简介KVC(Key-Value Coding)和KVO(Key-Value Observing)是OC中最强大最实用的功能之一。目前为止,可以通过存取方法,属性或者直接设置实例变量来直接更改对象状态,也可以通过字符串模式来更改对象zhaungtai,这种方式称为键值编码(KVC)。KVC提供了一种在运行时而非编译时动态访问对象属性与实例变量的方式。

累人猿 461

对KVC和KVO的理解

对KVC和KVO的理解 对KVC和KVO的理解 kvc kvo KVC KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。 KVC实例 一个对象拥有某些属性。比如说,一个Person对象有一个name和一个address属性。以KVC为例,...

FH199211的博客 201

iOS底层原理——KVO和KVC

一、KVO 1、概述 KVO的全称是KeyValueObserving,俗称“键值监听",可以用于监听某个对象属性值的改变; KVO是苹果提供的在套事件通知机制。KVO和NSNotificationCenter都是iOS中观察者模式的一种实现,区别是:NSNotificationCenter可以是一对多的关系,而KVO是一对一的; 2、KVO的使用 使用KVO分为三个步骤: 注册KVO监听 通过[addObserver:forKeyPath:options:context:]方法注册KVO,这样可以接收

iOS0214227的博客 2397

KVO和KVC

kvc:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。   很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。   kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。   具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。   比如我自定义的一个button   [sel

Anguslongjun的博客 257

iOS - KVC和KVO详解

KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。 在实现了访问器方法的类中,使用点语法和KVC访问...

宋卓的博客 525
上一篇: UIWebView 小结
下一篇: NSString / NSData / char* 类型之间的转换
D_origin
博客等级 码龄11年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值