`

kvc kvo 学习笔记

    博客分类:
  • ios
阅读更多

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=
最后一次修改是直接修改  所以没法产生通知
分享到:
评论

相关推荐

    ios-KVC和KVO学习笔记.zip

    但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value Coding,简称KVC)的基础上,也就是说任何你想使用KVO观察的属性必须符合键值编码。 这个demo主要以字符串、数组为例来学习键值编码和键值观察。 ...

    oc中的通知,kvc,kvo

    关于ios学习中的通知和kvc,kvo案例的整理,基础的oc学习

    swift-KVC与KVO使用姿势和原理解析

    KVC 与 KVO 使用姿势和原理解析

    KVO-KVC-demo

    与博客配套的KVC KVO代码,博客地址http://blog.csdn.net/liuyinghui523/article/details/77885198 简单的总结

    KVC KVO的使用方法

    本文档主要是针对KVC和KVO的使用方法的一些总结,希望对大家有所帮助。

    KVC_KVOTest Demo代码

    KVC_KVOTest Demo代码 KVC KVO IOS 观察者 Observe

    IOS KVC和KVO

    已经拥有一年经验的你真的了解KVC,KVO吗?也许不!以前我以为自己都有上架项目,这都是太基础的东西,但今天我重新回头看了以前做的笔记,真的是书读百遍,其义自见。

    IOS中KVC和KVO用法demo

    使用KVC对属性赋值 使用KVC对属性取值 KVC对数组取值 KVO是key value observing, 它是一种非常重要的机制,允许监听属性值的变化

    KVC、kVO原理详解

    KVC、kVO原理详解

    iOS中KVC-KVO例子

    iOS中KVC-KVO例子,

    KVC和KVO实例

    自己练习swift时做的KVC和KVO的案例,供初学者使用

    KVC_KVO_Demo

    相信通过这个工程可以让初学者更好的理解iOS的kvc和kvo模式,如果有需要相关文档的可以留言给我。

    KVC,KVO机制

    KVC 是基于OCRuntime机制,Runtime机制里面可以通过得到实例变量并且访问其私有的成员变量区;实现keyPath中的访问能力;KVO一种通知发送机制,实现一对多,多对一的映射关系

    ios中整理别人的KVC与KVO代码

    这里是我看别人博客写的kvc与kvo,自己写的代码,本来不打算收费,但是找不到免费的按钮在哪,所以就选了最小的资源分数1.

    KVC-KVO原理详解及编程指南

    详细的介绍了KVO与KVC的原理机制,可以有效运用KVO-KVC编程

    oc中kvc与kvo代码

    代码仅供参考 #import "lgsAppDelegate.h" #import "Student.h" #import "Teacher.h" @implementation lgsAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:...

    ios kvo kvc 编程

    英文文档 iso kvo kvc "mvc with less code".

    【Debugging Tips, Searching, Notifications, KVC,KVO】[PDF] [iPhone/iPad/iOS]

    【Debugging Tips, Searching, Notifications, KVC,KVO】[PDF] [iPhone/iPad/iOS]

    MAC下KVO,KVC的小demo

    KVO,KVC在MAC下的小DEMO,喜欢的换就拿去吧

    kvo-kvc介绍

    对kvo-kvc使用的说明。对于初学者有一定的帮助,对代码优化有一点好处。

Global site tag (gtag.js) - Google Analytics