KVC是一種非常方便的給各種自定義類的屬性賦值的方式
@interface Person : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *gender;
@end
@class Person;
@interface Earth : NSObject
@property (nonatomic, retain) Person *person;
@end
-(void)setValue:forKey://Key是實(shí)例變量的變量名
Person *p = [[Person alloc] init];
[p setValue:[NSString stringWithFormat:@"Archer"] forKey:@"name"];
Earth *earth = [[Earth alloc] init];
[earth setValue:p forKey:@"person"];
-(id)valueForKey:
NSString *st = [p valueForKey:@"name"];
-(id)valueForKeyPath://點(diǎn)語(yǔ)法表示路徑
NSString *pN = [earth valueForKeyPath:@"person.name"];
-(void)setValue:forKeyPath:
[earth setValue:@"Smith" forKeyPath:@"person.name"];
-(void)setValuesForKeysDictionary://以字典里的key作key,以字典里的value做value,這是一種快捷寫(xiě)法
NSDictionary *pD = [[NSDictionary alloc] initWithObjectsAndKeys:@"Mary",@"name",@"W",@"gender",nil];
[p setValuesForKeysDictionary:pD];
-(void)setValue:forUndefinedKey://如果輸入的key和變量名以及其變體(key,_key,isKey,_isKey)不同,就會(huì)崩潰,如果想要通過(guò)這樣的key訪問(wèn),就需要重寫(xiě)Undefined方法
-(id)valueForUndefinedKey:
@implementation Person
-(void)setValue:(id)value forUndefinedKey:(NSString*)key{
if ([key isEqualToString:@"name1"]) {
self.name = value;
}else if ([key isEqualToString:@"gender1"]) {
self.gender = value;
}
}
-(id)valueForUndefinedKey:(NSString*)key {
if ([key isEqualToString:@"name1") {
return _name;
}else if ([key isEqualToString:@"gender1"]) {
return _gender;
}
@end
實(shí)現(xiàn)機(jī)制
1.setName: kvc賦值首先在類中查找set+Key:名字的方法;如果類中不存在這樣的方法,轉(zhuǎn)2
2.在類中查找和(_key、_isKey、key、isKey)相同的實(shí)例變量;如果實(shí)例變量不存在,轉(zhuǎn)3
3.進(jìn)入U(xiǎn)ndefined方法,需要自行重寫(xiě)setValue:forUndefinedKey:和valueForUndefinedKey: