标签:
基本的KVC由NSKeyValueCoding协议提供支持
setValue:属性值 forKey:属性名
valueForKey:属性名
#import<Foundation/Foundation.h>
@interface User:NSObject
@property (nonatomic,copy) NSString* name;
@property (nonatomic,copy)NSString* pass;
@property(nonatomic,copy)NSDate* birth;
@end
#import "User.h"
int main(int arg,char*argv){
@autoreleasepool{
User* user=[[User alloc] init];
[user setValue:@"hello" forKey:@"name"];
NSLog(@"user的name为:%@",[user valueForKey:@"name"]);
}
}
在KVC编程方式中,无论是调用setValue:forKey:方法,还是调用valueForKey:方法,都是通过NSString对象来指定被操作属性的,其中forKey标签由于传入属性名,对于setValue:属性值 forKey:@"name"代码的底层实现机制如下,1.程序会优先考虑调用“setName:属性值”,试图通过setter方法实现设置;2.如果该类中没有setName:方法,那KVC机制会搜索类中名字为_name的成员变量,无论该成员变量是在类接口部分定义还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际上就是对_name成员变量进行赋值。2.如果该类既没有setName:方法,也没有_name成员变量,那么KVC机制会搜索该类中名为name的成员变量,无论该成员变量是在类接口部分定义还是在类实现部分定义,也无论是使用哪个访问控制符进行修饰,这条KVC代码层实际上就是对name成员变量进行赋值,4.如果上面都没有找到,那么系统便会执行该对象的setValue:forUndefinedKey:方法。默认的setValue:forUndefinedKey:方法实现就是引发一个异常,这个异常将会导致程序异常结束。
valueforKey和上述相同,其会调用valueForUndefinedKey方法
如果不想引起上述的两个异常,则可以重写两个异常的方法,从而实现不抛出异常。
key路径--复合的键值
Order对象内包含一个Item类型的item,Item对象有包括name和price属性
setValue:forKeyPath:
valueForKeyPath:
实例如下:
#import <Foundation/Foundation.h>
#import "Item.h"
@interface Order :NSObject
@property(nonatomic,strong) Item* item;
@property(nonatomic,assign) int amount;
-(int)totalPrice;
@end
#import "Order.h"
int main(int arg,char*argv[]){
@autoreleasepool{
Order* order=[[Order alloc] init];
[order setValue:@"12" forKey:@"amount"];
[order setValue:[[Item alloc] init] forKey:@"item";
[order setValue:@"iphone" forKeyPath:@"item.name"];
}
}
标签:
原文地址:http://blog.csdn.net/shb2058/article/details/51362103