07OC之KVC、KVO
在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性、
一、键值编码(KVC)
在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利用字符串的方法去控制一个对象,其实在OC中,根本不需要任何操作就可以进行属性的动态读写,这个方式就是KVC。
KVC的操作方法由NSKeyValueCoding协议提供的,而NSObject就是实现了这种协议,也就是说OC中的任何对象都支持这种KVC操作,常用的操作如下:
动态设置:
1、setValue:属性值 forKey:属性名
2、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有个Account类型的属性,那么Person.Account就是一个复合属性)
动态读取:
1、valueForKey:属性名
2、valueForKeyPath:属性名
下面通过一个例子理解KVC
Account.h
Account.m
Person.h
Person.m
main.m
执行结果如下:
KVC应该比较简单,那到底他是如何查找一个属性进行读取的呢?假如KVC要对a进行动态读写:
1、如果是动态设置属性,优先考虑setA方法,如果没有该方法则优先搜索成员变量_a,如果仍然不存在则搜索成员变量a,如果最后还是搜索不到,就会调用这个类的setValue:forUndeinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能设置)
2、如果是动态读取属性,有限考虑a方法,属性a的getter方法,如果没有搜索到则会优先搜索成员变量_a,如果还是不存在则搜索成员变量a,如果还是不存在则会调用这个类的valueforUndefinedKey:方法
二、键值监听KVO
在WPF、Silverlight中有一种双向绑定机制,当数据模型修改了之后,会立即反应到UI视图上,类似的还有前端Web的MVVM框架,例如Knockout.js。其实OC原生就已经支持这种模式,它叫做Key Value Observing(简称KVO),可以理解成观察者模式,利用它很容易实现视图组件和数据模型的分离,当数据模型的属性值变化,会触发组件的自身。在OC中要想实现KVO则要先实现NSKeyValueObServing协议,幸运的是NSObject已经实现了该协议。
在OC中使用KVO常用的方法如下:
1、注册指定Key路径的监听器: addObserver: forKeyPath: options: context:
2、删除指定Key路径的监听器:removeObserver: forKeyPath、removeObserver: forKeyPath: context:
3、回调监听: observeValueForKeyPath: ofObject: change: context:
使用步骤:
1、通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
2、重写监听器的observeValueForKeyPath: ofObject: change: context:方法
由于我们还没接触到界面编程,那么我们继续使用上面的例子进行扩展,假如我们希望余额变动的时候,用户可以收到通知,那就是Account就作为我们的被监听对象,需要Person为它注册监听,而人员作为监听器需要重写回调监听事件,以下为模拟这个过程:
Account.h
Account.m
Person.h
Person.m
main.m
在上面的代码中,我们在给人员分配账户时给账户的balance属性添加了监听,并且在监听回调方法中输出了监听到的信息,同时在对象销毁时移除监听,这就构成了一个典型的KVO应用。
07OC之KVC、KVO的更多相关文章
- KVC/KVO原理详解及编程指南
一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...
- 【转】 KVC/KVO原理详解及编程指南
原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...
- kvc/kvo复习
kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...
- 转:KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value Observing的简写,是键值观察的意思.那么我们能拿KV ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- 04 KVC|KVO|Delegate|NSNotification区别
一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果: 二. KVC ...
随机推荐
- 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)
说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...
- [No00007D]2016-面经[上]
面试常见问题: 题一:"请你自我介绍一下" 思路:1.这是面试的必考题目.2.介绍内容要与个人简历相一致.3.表述方式上尽量口语化.4.要切中要害,不谈无关.无用的内容.5.条理要 ...
- 由于log太多导致ubuntu硬盘空间满了,进入不了系统解决办法
具体现象是在图形界面输入用户名和密码之后,再次提示需要输入用户名和密码. 步骤一:按快捷键进入命令行界面.ctrl+alt+f1. 步骤二:清空文件 clear log cd /var/log sud ...
- PAT 1040. 有几个PAT(25)
字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问 ...
- 选中多个<ul>中的第一个<li>方法
获取第一个ul中的第一个li标签的方法: //获取第一个ul中的第一个li /* $("ul li:first").css("background"," ...
- java多线程系类:JUC锁:01之框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...
- C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度
首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...
- Oracle转换时间出现的问题:ORA-01810: format code appears twice
Oralce中的to_date()函数用于将字符串转换为日期对象: to_date( string, [ format_mask ] , [ nls_language ] ) string1 要转换的 ...
- 五种方法让CSS实现垂直居中
利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法.我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站. 使用 CSS 实现垂直居中并不容易.有些方法在一些浏览器 ...
- EF7 使用 K EF 异常
在使用EF 7 Code first功能时. k ef 报如下错误: 解决办法: 在project.json 同级目录下新建k.cmd,内容如下: "%~dp0approot\runtime ...