KVC编码由NSKeyValueCoding协议提供,
有两个方法:
【1】 为指定的属性设置值: setValue:属性值 forKey:属性名
该方法的底层执行机制:
(1)程序优先考虑setter方法实现属性赋值。
(2)如果程序中不存在该方法,则KVC机制将会搜索类名_****(如:_name)类型的成员变量,无论该变量在什么位置,KVC底层的代码实际上都是为它赋值。
(3)如果以上两种情况都没有,那么底层代码就会直接对成员变量赋值,(如:name);
(4)如果以上情况都不满足,则会执行对象的setValue:forUndefinedKey:方法,引发异常调用。
如果属性名不存在,则会报错,程序引发“NSUnknownKeyException”异常,会是程序异常结束,如果不想使程序结束,可以重写setVal:forUndefinedKey:方法。
【2】获取指定属性的值:valueForKey:属性名
该方法的底层执行机制:
与上述方法的属性获取类似。
注意:引发该对象的异常调用方法是:valueforUndefinedKey:方法。
简单测试:
FKUser.h
#import <Foundation/Foundation.h>
@interface FKUser : NSObject
{
NSString* name;
NSString* pass;
NSString* birth;
}
@property (nonatomic,copy)NSString* name;
@property (nonatomic,copy)NSString* pass;
@property (nonatomic,copy)NSString* birth;
@end
FKUser.m
#import "FKUser.h"
@implementation FKUser
@synthesize name;
@synthesize pass;
@synthesize birth;
@end
main.m
#import <Foundation/Foundation.h>
#import "FKUser.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
FKUser* user = [[FKUser alloc] init];
[user setValue:@"nanyang " forKey:@"name"];
[user setValue:@"1234" forKey:@"pass"];
[user setValue:@"12-09" forKey:@"birth"];
NSLog(@"name is %@ ",[user valueForKey:@"name"]);
NSLog(@"pass is %@ ",[user valueForKey:@"pass"]);
NSLog(@"birth is %@ ",[user valueForKey:@"birth"]);
}
return 0;
}