KVO和KVC简介

一、Key-Value-Observing--KVO(键值观察者模式)
(1)简介:
此机制可以在一个类中监听另外一个类的属性变化,包括我们自己的类和已有的Cocoa类库中的类。当被监听的类的属性发生了变化时,观察者会收到通知,可以针对属性变化添加自己的动作。
(2)为被监听对象注册观察者:指定观察者,要观察的属性的名称,options可以传0值。
– addObserver:forKeyPath:options:context:
(3)观察者实现通知接收函数:
– observeValueForKeyPath:ofObject:change:context:
(4)在不需要观察者或者观察者销毁前移除观察者:
– removeObserver:forKeyPath:context:
(5)当被监听的对象的对应key值发生更改时,观察者会收到通知,比如给属性直接赋值,后者调用-setValue:forKey:方法。

二、KVO的通知触发方式:
(1)在观察者类中实现+ automaticallyNotifiesObserversForKey:方法,当返回YES时,该key会在值发生改变时自动触发通知,如果返回NO,需要手动触发通知,在值改变前后加如下方法:– willChangeValueForKey:    – didChangeValueForKey:
(2)是自动还是手动,根据实际情况定,默认是自动的。
(3)当直接赋值时,要加上对象,如当前对象的属性改变时要加self,否则不触发通知,需要手动触发。

三、KVO 依赖键

有时候一个属性的值依赖于其他属性值,那么如果其他属性值发生变更,那么必然也就导致该属性值的变更,也即 Dependent Poroperties。在KVO中,引入了依赖键

在KVO中,提供了如下两种实现 依赖键 的方法:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key    
  2.     
  3. + (NSSet *)keyPathsForValuesAffecting<Key>   
例如,information 属性依赖于 target 的 age 和 grade 属性,target 的 age/grade 属性任一发生变化,information 的观察者都会得到通知。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (NSSet *)keyPathsForValuesAffectingInformation    
  2. {    
  3.     NSSet * keyPaths = [NSSet setWithObjects:@"target.age", @"target.grade", nil];    
  4.     return keyPaths;    
  5. }    
  6.     
  7. + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key    
  8. {    
  9.     NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key];    
  10.     NSArray * moreKeyPaths = nil;    
  11.         
  12.     if ([key isEqualToString:@"information"])    
  13.     {    
  14.         moreKeyPaths = [NSArray arrayWithObjects:@"target.age", @"target.grade", nil];    
  15.     }    
  16.         
  17.     if (moreKeyPaths)    
  18.     {    
  19.         keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths];    
  20.     }    
  21.         
  22.     return keyPaths;    
  23. }   
要实现 keyPathsForValuesAffectingInformation  或 keyPathsForValuesAffectingValueForKey: 方法是告诉系统 information 属性依赖于哪些其他属性,这两个方法都返回一个key-path 的集合。


如果选择实现 keyPathsForValuesAffectingValueForKey,要先获取 super 返回的结果 set,然后判断 key 是不是目标 key,如果是就将依赖属性的 key-path 结合追加到 super 返回的结果 set 中,否则直接返回 super的结果。

注:显然前者实现过程简单。


四、Key-Value-Coding--KVC(键值编码)
(1)该机制会把类的属性作为一个key处理。
(2)取值:[object valueForKey:@"key"];
    设值:[object setValue:@"value" forKey:@"key"];
(3)KVO是基于KVC实现的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系答辩麻烦,计算机专业的你,答辩时有多卑微?

你用英语都写不出来的东西就别指望用代码写了。又是一年毕业季&#xff0c;计算机专业的同学们&#xff0c;毕业设计都做好了吗&#xff1f;论文都写完了吗&#xff1f;查重过了吗&#xff1f;答辩准备好了吗&#xff1f;答辩&#xff0c;是你毕业前面临的最后一道关卡&#xf…

计算机 窗口打开的方法,如何打开命令行窗口?两种实用的方法介绍

Windows系统中常常会用到命令行窗口&#xff0c;那么我们该如何打开命令行窗口?接下来&#xff0c;小编为大家介绍两种实用的打开命令行窗口的技巧&#xff0c;再也不必担忧如何打开命令行窗口的烦恼了。第一种打开方法1.点击自己的电脑中的开始菜单&#xff0c;在菜单中找到运…

王者荣耀服务器维护bug,8月23日王者荣耀ios版更新一直显示维护是什么情况?更新出现bug 附处理方法...

相信很多喜爱玩王者荣耀的游戏玩家可以知道今天是王者荣耀星计划更新的日子&#xff0c;但是有很多苹果手机的小伙伴出现了一个问题&#xff0c;那就是无法进入游戏&#xff0c;甚至是更新十分的缓慢&#xff0c;在这里本文为您带来最新的解决方法&#xff01;苹果手机微信区一…

服务器任务栏不显示程序,Win10任务栏不显示应用程序标签怎么办?

Win10任务栏不显示应用程序标签怎么办?执拗的人才会一条路走到黑&#xff0c;多个朋友多条路&#xff0c;多个方法多种选择。关于Win10任务栏不显示应用程序标签&#xff0c;一般是explorer进程出现故障导致&#xff0c;哦!忘记说了Win10系统下这东东改了个好听的名字&#xf…

碧雪情天服务器地址源如何修改,稀有游戏《碧雪情天online》网络版王者归来一键服务端+客户端 支持转生系统和新图...

碧雪情天online王者归来版本介绍&#xff1a;1.增加新的职业套装;2.增加高川台、雪域、魔灵和天庭等新图;3.仙侠岭先知处添加角色转生功能&#xff1b;4.碣石村宝官添加装备签名和祝福卡兑换角色经验功能&#xff1b;5.增加宠物经验兑换角色经验功能&#xff1b;6.其它新内容和…

刚买的ubuntu服务器 为什么没有文件,新买的linux服务器怎么使用

新买的linux服务器怎么使用 内容精选换一换切换操作系统是为您的弹性云服务器重新切换一个系统盘。切换完成后弹性云服务器的系统盘ID会发生改变&#xff0c;并删除原有系统盘。如果弹性云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高)&#xff0c;…

iOS应用横竖屏切换

一、概述&#xff1a; 在iOS应用中&#xff0c;由UIViewController来控制屏幕翻转&#xff0c;根据需要随设备方向自动切换。在iOS6和之前的系统之间&#xff0c;控制方法发生了些变化。二、视图伸缩属性&#xff1a;1.UIView类的autoresizingMask属性&#xff0c;用来指定当它…

三维转换矩阵解释

一、图解 二、单位矩阵{1.0f&#xff0c;0.0f&#xff0c;0.0f&#xff0c;0.0f;0.0f&#xff0c;1.0f&#xff0c;0.0f&#xff0c;0.0f;0.0f&#xff0c;0.0f&#xff0c;1.0f&#xff0c;0.0f;0.0f&#xff0c;0.0f&#xff0c;0.0f&#xff0c;1.0f;}

CoreAnimation编程指南(一)概念

一、概述1.核心动画是一套包含图形绘制&#xff0c;投影&#xff0c;动画的Objective–C类集合。它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式&#xff0c;同时使用先进的合作效果提供了一套流畅的动画。2.动态的动画接口很难创建&#xff0c;但是核…

python实现常见排序算法

python实现常见排序算法 快速排序 思想&#xff1a;取出第一个元素把它放到序列的中间某一个正确位置&#xff0c;以它进行分割成左边和右边&#xff0c;再分别对左边和右边进行取元素分割&#xff08;递归&#xff09; 递归实现 def quicksort(array):if len(array) < …

CoreAnimation编程指南(二)渲染架构

1.虽然核心动画的图层和Cocoa的视图在很大程度上没有一定的相似性&#xff0c;但是他们两者最大的区别是&#xff0c;图层不会直接渲染到屏幕上。2.在模型-视图-控制器&#xff08;model-view-controller&#xff09;概念里面NSView和UIView是典型的视图部分&#xff0c;但是在…

学习递归

算法之递归 递归思想 递归就是函数自己调用自己&#xff0c;会使代码逻辑很清晰&#xff0c;但是Stack Overflow上有说的一句话&#xff1a;“如果使用循环&#xff0c;程序的性能可能更高&#xff1b;如果使用递归&#xff0c;程序可能更容易理解。如何选择要看什么对你来说…

CoreAnimation编程指南(三)几何变换

本章介绍图层的几何组成部分&#xff0c;及他们之间的相互关&#xff0c;同时介绍如何变换矩阵可以产生复杂的视觉效果。一、图层的坐标系1.图层的坐标系在不同平台上面具有差异性。在iOS系统中&#xff0c;默认的坐标系统原点在图层的中心左上角地方&#xff0c;原点向右和向下…

队列和栈

栈 一张图可以简单的说明 为了达到时间复杂度最低&#xff1a;选择的是python列表实现栈&#xff0c;而列表是顺序表 入栈push的时候选择在列表的尾部进行添加元素&#xff0c;出栈在列表尾部弹出 class Stack(object):"""栈"""def __init__(…

CoreAnimation编程指南(四)图层树结构

图层不但给自己提供可视化的内容和管理动画&#xff0c;而且充当了其他图层的容器类&#xff0c;构建图层层次结构。 本章介绍了图层层次结构&#xff0c;以及如何操纵该图层层次结构。一、什么是图层树的层次结构1.图层树是核心动画里面类似Cocoa视图的层次结构。比如一个NSVi…

学习散列表

回顾一下简单查找和二分查找 杂货店商品对应的价格举例&#xff1a; 简单查找就是拿出商品价目本&#xff0c;这个价目本并不是有序的&#xff0c;顾客问苹果多少钱&#xff0c;需要一个一个去查找某一个商品的价格&#xff0c;需要O(n)时间。 同样是一个价目本&#xff0c;但…

CoreAnimation编程指南(五)图层内容

当我们使用Cocoa的视图的时候&#xff0c;我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容。但是CALayer实例可以直接使用&#xff0c;而无需继承子类。因为CALayer是一个键-值编码兼容的容器类&#xff0c;你可以在实例里面存储任意值&#xff0c;所以子类实…

SHA算法

回顾散列算法 我的上篇文章&#xff1a;学习散列表 在上篇文章杂货铺的示例中&#xff0c;我们希望散列函数的结果是均匀分布的。散列函数接受一个字符串&#xff0c;并返回一 个索引号。 安全散列算法&#xff08;secure hash algorithm&#xff0c; SHA&#xff09;函数 给…

python实现搜索之二分查找

搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的&#xff0c;因为该项目是否存在。 搜索的几种常见方法&#xff1a;顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找&#xff0c;优点是比较次数少&#x…

CoreAnimation编程指南(九)图层布局

NSView提供了经典的“stuts and springs”模式&#xff0c;用于视图调整大小的时候把关联到它父图层的视图重新调整位置。图层支持该模式&#xff0c;而且Mac OS X上面的核心动画提供了一个更通用的布局管理器机制&#xff0c;允许开发者自己写他们自己的布局管理器。可以为图层…