理解KVC与KVO(键-值-编码与键-值-监看)
时间: 2009-06-11 20:04 点击: 次
KVC(Key-Value Coding)和KVO(Key-Value Observing)可能是Objective-C中最强大最实用的功能之一。
下面的几个例子可以帮你更好的理解它们。
原文作者:Marcus Zarra
当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。
Core Data参数
在其中一个方法中,我做了一个单独的对象,来响应参数请求。这样程序的任何部分要调用参数时,无需每次都在需要时必须创建NSfetchRequest,而是直接通过一小段干净的代码直接获取。这样一来,程序的其他部分只需要这样简单地进行调用:
NSString *companyName = [[Company shared] valueForKey:kCompanyName];
而无需使用下面这么多代码:
NSString *companyName = nil;
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Parameter" inManagedObjectContext:managedObjectContext]]];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", kCompanyName]];
NSError *error = nil;
companyName = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
NSAssert(error == nil, ([NSString stringWithFormat:@"Error requesting parameter: %@\n%@", kCompanyName, error]));
最糟糕的情况是当我想设置一个参数值时:
id parameter;
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Parameter" inManagedObjectContext:managedObjectContext]];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", key]];
parameter = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
NSAssert(error == nil, ([NSString stringWithFormat:@"Error getting parameter %@:%@", key, error]));
if (!parameter) {
parameter = [NSEntityDescription
顶一下(1)
50%
踩一下(1)
50%
打印 上一篇:关于按钮的action的问题
下一篇:KVC调用方法列表
发表评论
本类文章点击排行榜
- [06-18] Cocoa夜未央第一期 Cocoa的基本
- [06-18] UITableView实例教程:创建Tabl
- [06-18] Cocoa夜未央第三期 MVC,界面编
- [06-18] Cocoa夜未央第二期 xcode及基本
- [06-11] Google的开源苹果软件更新框架
- [06-02] XCode自带Source Control Manager(SC
- [06-11] Leopard轻松编程:帮你节省代码
- [06-11] WebKit的基本用法
- [06-18] NSLog 输出格式
推荐内容
最近更新
- [07-09] NSSlider控件出现残像的解决方法
- [07-07] 调用系统现成importer来获取文件metadata的方法
- [06-30] 实现鼠标拖拽删除对象时烟雾缭绕效果的代码
- [06-28] QuickLook 调用示例代码
- [06-22] Cocoa里的字符串,NSString介绍
- [06-22] Cocoa里参数传递引用的方法
- [06-21] 在 xcode中进行条件编译的方法
- [06-18] 将iPhone的png图片转换为可读png图片的Python源码
- [06-18] 在苹果应用程序里打开PDF文档的方法

XCode自带Source Control Manager(SCM)以及SnapShots用法
XCode、Cocoa开发中使用第三方dylib的方法
[系统控件重绘教程(二)]重绘NSButton
创建Xcode自定义模板的图文教程
在Cocoa中使用TagLib获取歌曲ID3信息
iLife 08风格的Source List代码