今日就来回顾一下KVC。在object-c中,前面使用@property关键字可以为类的成员变量自动生成它的geter与setter方法,从而可以直接使用点语法来访问
类的成员变量。其实,object-c中还有另外一个方式来间接访问类的成员变量。那个就是今天回顾的KVC了
KVC的概念:Key---Value--coding.直译就是“键值编程”。其实使用KVC,还有使用键路径的方式访问数据的,下面再表。
在每一个对象当中的成员变量,在KVC中都会有一个key对应着这个成员变量的值,而key是一个字符串,但是这个字符串的内容是有很明确的规定的。
必须是成员变量的名字。也就是说,KVC就是通过这个字符串来查找成员的变量,并进行访问的。
那么,KVC内部是如何查找的呢?它也是按照一定的顺序,比如先按照(key)来查找,找不到就is(key).....这部分KVC内部实现原理的知识还没有深入研究,
知识大概了解过。网上有很多这些资料。同理,在获取也是通过的方式的。
使用键值的方式访问变量,常用的方法是 [setValue forkey] 和[ valueforkey ];
好,下面马上post上代码。
1、首先在工程中添加一个Person的类,在.h文件中添加它的两个成员age ,books。同时,也定义一个Book的类.
//Person.h
@interface Person : NSObject
{
int height;
Book *books;
}
<span style="font-family: Arial, Helvetica, sans-serif;">@end</span>
@implementation Person
@end
//Book.h
@interface Book : NSObject
@property (nonatomic, assign) double price;
@end
//Book.m 同样没有对price成员变量做实现get和set方法,代码不贴。
在主函数里面调用:
Person *Jack = [[Person alloc] autorelease];
NSNumber *JackHeight = @(10);
[Jack setValue:JackHeight forKey:@"height"];//通过key对成员变量进行赋值
int height = [[Jack valueForKey:@"height"] intValue]; //通过key获取成员变量的值
NSLog(@"Jack height:%d",height);
输出结果:
2014-11-13 23:48:24.257 Foundation04-NSArray(OC数组)[785:303] Jack height:10
总结:使用KVC的键值间接访问成员变量。
2、除了通过键值访问类的成员变量,还可以通过键路径的方式访问。思路就是每一层数据的包含,都会有对应的路径一一对应。这个就像一个树状图一样,顺藤摸瓜!
在主函数中调用:
Person *Chuck = [[Person alloc] autorelease];
Book *book1 = [[Book alloc] autorelease];
book1.price = 20.3;
[Chuck setValue:book1 forKey:@"books"];
NSNumber *bookPrice = [Chuck valueForKeyPath:@"books.price"];
NSLog(@"chuck`s books price is:%f",[bookPrice doubleValue]);
输出结果:
2014-11-13 23:56:01.502 Foundation04-NSArray(OC数组)[820:303] chuck`s books price is:20.300000
总结:键路径跟键值访问其实都是一样的。至于KVC原理,看了也忘了,也是记得大概。
---今晚好累,想早点训教!谢谢各位浏览并作出指导!晚安,to be continut.!