http://www.evernote.com/shard/s20/sh/31282c0d-f702-4900-9842-cffd64cdc45a/fbf2f02e8cd81c5f9445f825ca1531d3
kvc 就是一种通过字符串去间接操作对象属性的机制,
访问一个对象属性我们可以 person.age 也可以通过kvc的方式 [person valueForKey:@"age"]
keypath 就是属性链式访问 如 person.address.street 有点象java里面的pojo ognl表达式之类的
Collection Operators
假如有一个数组 NSArray *sellers, 数组里每一个元素都是用一个Dic来代表一个seller, Dic里面有个key可以拿到一个数组account, 假如我想把所有seller里面的所有accounts里面的account一次拿出来,以往要遍历数组, 现在只要
NSArray *accounts = [sellers valueForKeyPath:@"@distinctUnionOfArrays.accounts"]
这句话相当于对遍历每一个sellers里面的元素(Dic)访问accounts属性(数组),然后拿出这些数组里面的值, 合成一个数组;
假如给出的字符串没有对象的属性 会访问valueForUndefineKey方法 默认实现是raise 一个异常 但你可以重写这个方法, setValue的时候也是一样的道理
key path accounts.transactions.payee would return an array with all the payee objects, for all the transactions, in all the accounts.
当设置一个非对象属性为nil时会抛异常, 但你也可以重写方法
kvo 就是一个在语言框架层面实现的观察者模式 通过kvc的方式修改属性时,会主动通知观察者
例子
person类
@implementation Person
@synthesize name,age;
-(void) changeName{
name=@"changeName directly";
}
@end
PersonMonitor类 监视了name属性
@implementation PersonMonitor
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:@"name"]) {
NSLog(@"change happen, old:%@ new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);
}
}
@end
测试代码
Person *p =[[Person alloc] init];
PersonMonitor *pm= [[PersonMonitor alloc]init];
[p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld) context:nil];
NSLog(@"p.name is %@",p.name);
[p setValue:@"name kvc" forKey:@"name"];
NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);
p.name=@"name change by .name=";
[p changeName]; //can't be notify
输出
2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name
2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name new:name kvc
2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc
2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc new:name change by .name=
最后一次修改是直接修改 所以没法产生通知
分享到:
相关推荐
但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value Coding,简称KVC)的基础上,也就是说任何你想使用KVO观察的属性必须符合键值编码。 这个demo主要以字符串、数组为例来学习键值编码和键值观察。 ...
以上内容仅为OC学习笔记合集中的部分知识点概述,深入学习将涵盖更多主题,如Delegation、Design Patterns、网络编程、动画效果、Core Animation等。通过不断实践和探索,你将能够熟练掌握Objective-C,并能构建出...
14. **KVC(Key-Value Coding)**:KVC允许我们间接访问对象属性,比如动态设置属性值: ```swift setValue(value, forKey: "propertyName") ``` 15. **KVO(Key-Value Observing)**:KVO用于监听对象属性的...
8. **KVC(Key-Value Coding)与KVO(Key-Value Observing)**:这两种技术是OC中实现数据绑定的关键,笔记会介绍如何通过键值编码访问对象属性,以及如何监听并响应属性变化。 9. **Category与Extension**:...
【Objective-C 知识点详解】 Objective-C,简称OC,是苹果公司开发的面向对象的编程语言,它是C语言的超集,具有...Styf的学习笔记可能涵盖这些知识点的详细解释和示例,对于深入理解Objective-C编程大有裨益。
4. KVC(Key-Value Coding)和KVO(Key-Value Observing):KVC提供一种间接访问对象属性的方式,而KVO则允许监听并响应某个属性的变化。 三、iOS开发相关 在iOS开发中,Objective-C常与UIKit框架一起使用,构建...
深入学习Object-C,还包括了解其内存管理(如ARC,Automatic Reference Counting)、消息传递机制、KVC(Key-Value Coding)和KVO(Key-Value Observing)等概念。此外,理解 Blocks、GCD(Grand Central Dispatch)...
3. KVC和KVO:理解Key-Value Coding和Key-Value Observing,以及它们在实际编程中的应用场景。 二、UIKit与App生命周期 1. UIViewController的生命周期:掌握加载过程、状态保存和恢复、导航控制器的使用等。 2. ...
8. KVC(Key-Value Coding)与KVO(Key-Value Observing):KVC提供了一种间接访问对象属性的方式,而KVO允许对象监听其他对象属性的变化。 9. NSNotifications与Delegates:这两种机制用于对象间的事件传递。...
2. NSDictionary与NSMutableDictionary:键值对存储,理解KVC(Key-Value Coding)和KVO(Key-Value Observing)。 3. NSString:字符串操作,包括格式化、拼接、比较等。 五、UIKit框架 1. UIViewController:...
4. **KVC(Key-Value Coding)与KVO(Key-Value Observing)**:通过键值编码访问对象属性,以及观察并响应属性变化的机制。 5. **类别扩展**:一个示例,展示如何为系统类如NSArray或NSString添加自定义方法。 6. *...