KVO/KVC系列——KVC编程
来源:互联网 发布:soap java开发实例 编辑:程序博客网 时间:2024/06/05 01:11
在上篇KVO/KVC系列中,我们了解了什么是KVC,那么在实际的编码过程中,我们如何使用KVC呢?
在Cocoa中,NSObject默认实现了NSKeyValueCoding协议,也就是说,我们不需要自己再去实现NSKeyValueCoding协议,这极大的方便了我们的编程。试用了KVC之后,我们不仅可以通过访问方法来设置和修改属性的值,也可以通过NSKeyValueCoding提供的方法setVAlue:forKey和valueForKey:来设置和获得属性的值。
接下来,让我们先顶一个一个Person类:
[cpp] view plaincopy
- @interface Person : NSObject {
- NSString *_firstName;
- NSString *lastName;
- BOOL married;
- }
- @property (nonatomic, strong) NSString *address;
- @property (nonatomic, assign) NSInteger age;
- @end
在Person类中,我们定义了三个成员变量和两个属性。一般情况下,我们只能通过成员变量名访问成员变量,并且只能是Person类内部使用,外部的类是无法访问Person的成员变量,对于属性,无论是在类内还是在类外都可以通过属性的set和get方法进行访问,下面我们通过KVC的方法来设置Person类属性和成员变量的值。
[cpp] view plaincopy
- Person *person = [[Person alloc] init];
- person.address = @"北京市朝阳区";
- [person setValue:[NSNumber numberWithBool:YES] forKey:@"married"];
- [person setValue:[NSNumber numberWithInt:26] forKey:@"age"];
- [person setValue:@"倾城" forKey:@"firstName"];
- [person setValue:@"吕" forKey:@"lastName"];
除了address属性之外,其他属性(或成员变量)的值都是通过KVC提供的方法来设置的。接下来,我们将属性(或成员变量)的值读出来看看是不是与我们设置的值是一样的。对于使用KVC方法设置的值,我们不通过KVC的方法来读取,而是使用普通的方法,对于普通方法设置的值,我们通过KVC提供的方法来读取.
[cpp] view plaincopy
- [person valueForKey:@"address"]);
- NSLog(@"Age:%d",person.age);
- NSLog(@"Married:%d",[person isMarried]);
- NSLog(@"First Name: %@", [person firstName]);
- NSLog(@"Last Name: %@", [person lastName]);
输出结果为:
[cpp] view plaincopy
- 2013-08-08 11:43:04.810 TestKVC[2978:c07] Address:北京市朝阳区
- 2013-08-08 11:43:04.812 TestKVC[2978:c07] Age:26
- 2013-08-08 11:43:04.812 TestKVC[2978:c07] Married:1
- 2013-08-08 11:43:04.813 TestKVC[2978:c07] First Name: 倾城
- 2013-08-08 11:43:04.813 TestKVC[2978:c07] Last Name: 吕
与我们之前的设置一样。
对于成员变量,我们不能使用属性的get方法来访问,必须自己实现成员变量的访问方法。在这里,我们也可以使用KVC提供的valueForKey:方法来访问成员变量,这样我们就不需要自己实现成员变量的set和get方法了。
在上面的例子中,我们既有属性,又有成员变量。成员变量的命名有带下划线的,有不带下划线的。那么KVC是如何来查找这些东西的呢。
setValue:forKey:的搜索模式
- 如果没有并且接收者类的accessInstanceVariableDirectly的方法返回YES,接下来就要搜索成员变量了,顺序是:_<key>,_is<key>,<key>,is<key>
- 如果都没有找到,接收者类的setValue:forUndefinedKey:方法将被调用
- 按get<Key>,<key>,is<Key>的顺序搜索名字相符的访问方法,找到之后,相应的方法就会被调用。如果这个方法的返回类型是一个对象,那么结果将会被直接返回。如果返回的是NSNumber支持的数值类型,则将结果封装成NSNumber进行返回。如果不是NSNumber支持的类型,则会将结果转成NSValue进行返回(NSValue支持的类型包括NSPoint、NSRange、NSrect和NSSize等)
- 如果上面的方法都没有找到,接下来会搜索接收者类中的countOf<Key>和objectIn<Key>AtIndex和<key>AtIndexes。如果countOf<Key>方法和后面两个之一被找到的话,一个能响应所有NSArray方法的集合代理对象将会被返回。每一个发送给结合代理对象的NSArray消息都会使发送给接收者的valueForKey:的消息和countOf<Key>、objectIN<Key>AtIndex和<key>AtIndexes之间产生某种关联。如果接收者类也实现了名字如get<Key>:range:的可选方法,为了提高性能,这个方法将会在合适的时候被调用。
- 如果简单访问方法和NSArray的方法都没有被找到的话,接下来就会搜索接收者类中名字如下的一组方法:countOf<Key>,enumeratorOf<Key>和memberOf<Key>。如果这三个方法都被找到的话,一个能够响应所有NSSet方法的集合代理对象会被返回。每一个发给集合代理对象的NSSet消息都会使接收者类的valuefForyKey:的消息和countOf<Key>,enumeratorOf<Key>和memberOf<Key>之间产生某种关联。
- 如果上面的搜索都没有结果并且接收者类的accessInstanceVariableDirectly方法返回YES,接收者类按_<key>,_is<Key>,<key>,is<Key>的顺序搜索成员变量,如果找到了,成员变量的值将会被返回。如果成员变量的值类型是NSNumber支持的类型,将值进行转换之后返回一个NSNumber对象。否则将转换成NSValue对象进行返回。
- 如果还是什么都没有找到的话,就会调用valueForUndefinedKey:
如果你不想要setValue:forUndefiedKey:和valueForUndefinedKey的默认实现,你就需要自己重写这两个方法。
0 0
- KVO/KVC系列——KVC编程
- KVO/KVC系列之二——KVC编程
- KVO/KVC系列之一——什么是KVC
- KVO/KVC系列概论
- iOS —— KVC&KVO
- iOS编程——Objective-C KVO/KVC机制
- iOS编程——Objective-C KVO/KVC机制
- 深入理解 KVC\KVO 实现机制 — KVC
- 深入理解 KVC\KVO 实现机制 — KVC
- 深入理解 KVC\KVO 实现机制 — KVC
- 【iOS开发系列】KVC&KVO
- KVO & KVC 比较 - KVC
- OC学习——KVC KVO NSNotification
- 《OC——KVC和KVO》
- KVC、KVO
- KVO/KVC
- kvc 、kvo
- KVO/KVC
- 用OpenCV实现随机发生器与文本
- 在SSH2开发平台下利用Hibernate Session对象执行原生Sql语句
- WIN2008使用VPN远程网络默认网关问题
- Storm总结
- Hessian 理解
- KVO/KVC系列——KVC编程
- 算法学习_红黑树
- Android开发.9图片的绘制
- 如何在网页中加入title图标
- typedef和#define的用法与区别
- 使用 awk 命令
- aidl的简单使用
- 2016.01.21-------html5第二天
- centos6.5下安装nginx1.8.0