1.KVC(key value coding)
KVC:是使用字符串(键)访问一个对象实例变量的机制。而不是通过调用 Setter、Getter 方法等显式的存取方式去访问,用于监听属性值的变化。
总的来说共有三种方式:
1. 存值:[id setValue:value forKey:key]; 取值:[id valueForKey:key];
给id对象的key属性赋值value。此处key的值一定必须要和在id对象key属性一模一样。
2. 存值:[id setValue:value forKeyPath:key.key]; 取值:[id valueForKeyPath:key];
同样是给id对象的相应属性赋值,但此时后面将不再直接给出键,而是按照键值路径来查找出相应的键,系统会按『.』,自动进入对象内部,查找对象属性
XQParent *parent2 = [[XQParent alloc] init];
[parent2 setValue:dict[@"name"] forKeyPath:@"name"];
XQChidren *chidren2 = [[XQChidren alloc] init];
[parent2 setValue:chidren2 forKeyPath:@"children"];
[chidren2 setValue:dict[@"children"][@"name"] forKeyPath:@"name"];
NSLog(@"parent2.name:%@,parent2.chidren:%@ ,chidren2.name:%@",[parent2 valueForKeyPath:@"name"] ,[parent2 valueForKeyPath:@"children"],[chidren2 valueForKeyPath:@"name"]);
3.[id setValuesForKeysWithDictionary:NSDictionary];
上面的两种方式都需要取出来字典中的值,赋值给对象的相应属性。如果该对象要是有八九十来个属性,就要写八九十来行代码。这样太麻烦。碰到这样情况直接采用方式三便可。直接将整个字典作为参数传进来,便可将字典转化为model对象。
XQParent *parent3 = [[XQParent alloc] init];
[parent3 setValuesForKeysWithDictionary:dict];
XQChidren *chidren3 = [[XQChidren alloc] init];
[chidren3 setValuesForKeysWithDictionary:dict[@"children"]];
// [parent3 setValue:chidren3 forKeyPath:@"children"];
NSLog(@"parent3.name:%@,parent3.chidren:%@ ,chidren3.name:%@",[parent3 valueForKey:@"name"] ,[parent3 valueForKey:@"children"],[chidren3 valueForKey:@"name"]);
2.kvo key valued coding(键值编码)
kvo是 Objective-C 对观察者设计模式的一种实现,KVO 提供一种机制,指定一个被观察对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理;【且不需要给被观察的对象添加任何额外代码,就能使用 KVO 机制】
kvo,简单来说就是系统动态创建一个新类NSKVONotifying_x,并且重写这个类的setter方法。
1.注册通知
[aProduct addObserver:selfforKeyPath:@"name"options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
2.- (void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context{if([keyPath isEqualToString:@"name"]) {NSString*newName = [change objectForKey:NSKeyValueChangeNew]; ...//通知响相应视图根据newName变量的值进行更新}}
如果 ,重写setter,同时允许KVO工作,需要再setter方法里:
- (void)setProductName:(NSString *)newProductName{
[self willchangeValueForKey:@"productName"];
productName = newProductName;
[self didChangeValueForKey:@"productName"];
}
2. 一对多关系成员的情况
mutableArrayValueForKey:有序一对多关系成员 NSArray
[[self mutableArrayValueForKeyPath:@"numberMuArr"] addObject:numberStr];
mutableSetValueForKey:无序一对多关系成员 NSSet
[[self mutableArrayValueForKeyPath:@"numberMuArr"] removeLastObject];
网友评论