KVC 和KVO浅谈

一、KVC:Key-Value -Coding :直译为:键-值-代码;即:对键值进行改变的代码方法

该方法是OC(Object-C)为我们提供的一个不通过初始化方法而直接改变对象实例变量值的一种非正式Protocol的关键方法之一;

通过  [object setValue : value forKey : key];对该对象的对应的实例变量进行赋值操作,省略了初试化步奏,使用得当可以大大省略代码量;

二、KVO:Key-Value - Observe :直译为:键-值-观察;即:对键值对进行监视、观察的方法

该方法同样是OC(Object-C)为我们提供的一个不通过初始化方法而直接改变对象实例变量值的一种非正式Protocol的关键方法之一;

KVO和KVC同为基础框架类方法,是以后开发,扩展所需要的基础;

KVO主要通过

1、设置观察者

[object addObserver: observer  forKeyPath:key  options:options  context:context];

其中

第一个参数:observer:观察者,即担任观察者的对象。一般设为工程所在界面本身。

第二个参数:key:键的路径:即具体要监视的key所对应value的值

第三个参数:options:选项,预留参数,一般设置为0;

第四个参数:context:上下文:一般设置为Null;

2、观察内容发生变化触发的方法

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

当所监视key的value发生变化时,自动触发该方法;

3、注意编码结束后应该先移去观察者然后,才能释放观察者对象所有权;

三、代码演示:(该代码在MRC环境下编辑)

  1 A.设置将要监视的对象:
  2
  3 //  StockData.h
  4
  5 #import <Foundation/Foundation.h>
  6
  7 @interface StockData : NSObject
  8 {
  9     NSString *stockName;
 10    NSString  *price;
 11
 12 }
 13 @end
 14 //  StockData.m
 15 #import "StockData.h"
 16
 17 @implementation StockData
 18
 19 @end
 20
 21
 22 B、编辑主界面
 23 //  MainViewController.h
 24 #import <UIKit/UIKit.h>
 25
 26 @interface MainViewController : UIViewController
 27
 28 @end
 29
 30 //  MainViewController.m
 31
 32 #import "MainViewController.h"
 33 #import "StockData.h"
 34
 35
 36 @interface MainViewController ()
 37
 38 @property(nonatomic,retain)StockData *stockForKVO;
 39
 40 @property(nonatomic,retain)UILabel *aLabel;
 41
 42 @property(nonatomic,assign)NSInteger number;
 43
 44 @end
 45
 46 @implementation MainViewController
 47
 48 - (void)viewDidLoad {
 49     [super viewDidLoad];
 50     // Do any additional setup after loading the view.
 51
 52     self.number = 0;
 53
 54     _stockForKVO = [[StockData alloc]init];
 55
 56     [_stockForKVO setValue:@"searph" forKey:@"stockName"];
 57
 58     [_stockForKVO setValue:[NSString stringWithFormat:@"%ld",_number] forKey:@"price"];
 59
 60     [_stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
 61
 62     self.aLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
 63
 64     self.aLabel.textAlignment = NSTextAlignmentCenter;
 65     self.aLabel.textColor = [UIColor orangeColor];
 66     self.aLabel.text  = [_stockForKVO valueForKey:@"price"];
 67     [self.view addSubview:self.aLabel];
 68 //    [self.aLabel release];
 69
 70     UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 71
 72     btn.backgroundColor = [UIColor whiteColor];
 73     btn.frame = CGRectMake(100, 30, 100, 30);
 74
 75     [btn addTarget:self action:@selector(handleDown:) forControlEvents:UIControlEventTouchUpInside];
 76
 77     [self.view addSubview:btn];
 78
 79 }
 80
 81 - (void)handleDown:(UIButton *)sender{
 82
 83
 84
 85
 86
 87     _number ++;
 88
 89     [_stockForKVO setValue:[NSString stringWithFormat:@"%ld",_number] forKey:@"price"];
 90
 91 }
 92
 93
 94 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
 95
 96     if ([keyPath isEqualToString:@"price"]) {
 97
 98         self.aLabel.text = [_stockForKVO valueForKey:@"price"];
 99
100
101     }
102
103
104
105
106 }
107
108
109 - (void)dealloc{
110     [super dealloc];
111     [_stockForKVO removeObserver:self forKeyPath:@"price"];
112     [_stockForKVO release];
113
114
115 }
116
117
118 - (void)didReceiveMemoryWarning {
119     [super didReceiveMemoryWarning];
120     // Dispose of any resources that can be recreated.
121 }
122
123 /*
124 #pragma mark - Navigation
125
126 // In a storyboard-based application, you will often want to do a little preparation before navigation
127 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
128     // Get the new view controller using [segue destinationViewController].
129     // Pass the selected object to the new view controller.
130 }
131 */
132
133 @end
时间: 2024-10-10 00:53:01

KVC 和KVO浅谈的相关文章

iOS开发-由谈KVC、KVO(重点观察者模式)机制编程

一 不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文 化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧<学警狙击>中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者 --Laughing 哥.那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式. 文章内容思维导图 一.基本概念 1)KVC概念 KVC

浅谈iOS面试所遇问题

今天面试的公司之前在百科搜索了解了一些信息,一家专业拉手媒体运营商,付费通方便了用户出行,很喜欢公司的氛围. 言归正传,面对面试官的时候还是多少会有点小紧张,有几个问题回答的也是很笼统,现在做出总结.如下: 自我面试轻轻飘过~ 这个是常识 个人信息稍作了解,常识+1 浅谈MVC框架设计模式 浅谈单例设计模式 KVC/KVO Switch开关点击出错(on状态点击依旧on状态,解决方法) cell单元格重用出现的错误(解决方法) 怎样实现代理传值 怎样实现ImageView的点击事件处理 HTTP

11. KVC And KVO

1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制.KVO全称是Key-value observing,翻译成键值观察.提供了一种当其它对象属性被修改的时候能通知当前对象的机制.再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯. 2. KVC And

浅谈KAC

今天我研究了一下KVC,下面我将浅谈一下我对KVC的认识,可能认识不足,我会在后续学习生活中改正. 首先,看到KVC,我们会想这个知识点是干嘛的,其实我们了解一下,就会发现KVC(Key-Value-Coding),键值编码 KVC主要是用来间接访问实例变量(赋值)... 下面我们看一下苹果给的KVC的官方文档: /* Given a value and a key that identifies an attribute, set the value of the attribute. Giv

KVC 和 KVO

Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制.在这篇文章里,我们将接触一些如何利用这些特性的例子. 观察 model 对象的变化 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化:当用户和控制器交互的时候,模型也应该做出相应

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜