zoukankan      html  css  js  c++  java
  • IOS开发之KVC与KVO简述

    KVC:Key-Value Coding

    KVO:Key-Value Observing

    Person.m

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        //该访问修饰符用于说明即使私有成员变量也可以通过kvc方式访问和赋值
        @private
        NSString *_name;
        NSArray *_dogs;
    }
    @end
    
    @implementation Person
    @end

    Dog.m

    #import <Foundation/Foundation.h>
    
    @class Person;
    
    @interface Dog : NSObject
    {
        @private
        NSInteger _age;
        Person *_owner;
    }
    @end
    
    @implementation Dog
    @end

    PersonObserve.m

    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    @interface PersonObserve : NSObject
    @end
    
    @implementation PersonObserve
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
        Person *p = (Person *)object;
        //使用kvc方式获取成员变量keypath的值
        NSLog(@"%@",[p valueForKey:keyPath]);
    }
    @end

    main.m

    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "PersonObserve.h"
    #import "Dog.h"
    
    int main(int argc, const char * argv[]) {
        //观察者类
        PersonObserve *po = [[PersonObserve alloc] init];
        Person *p = [[Person alloc] init];
        //使用kvo方式对成员变量“name”的属性值变化增加观察者po
        //po将在该属性值发生变化时执行- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法
        [p addObserver:po forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
        
        //通过kvc方式设置成员变量“name”的属性值
        //触发观察者执行对应方法
        [p setValue:@"zhangsan" forKey:@"name"];
        
        
        //kvc中forKeyPath的用法
        Dog *d = [[Dog alloc] init];
        [d setValue:p forKey:@"owner"];
        [d setValue:@"lisi" forKeyPath:@"owner.name"];
        
        //移除对私有成员变量“name”的观察
        [p removeObserver:po forKeyPath:@"name"];
        
        
        Dog *d1 = [[Dog alloc] init];
        [d1 setValue:@10 forKey:@"age"];
        Dog *d2 = [[Dog alloc] init];
        [d2 setValue:@20 forKey:@"age"];
        
        
        NSArray *array = [NSArray arrayWithObjects:d1,d2, nil];
        [p setValue:array forKey:@"dogs"];
        
        
        //kvc中valueForKeyPath数组内置表达式的用法
        NSLog(@"dogs.age = %@",[p valueForKeyPath:@"dogs.age"]);
        NSLog(@"dogs.age.sum = %@",[p valueForKeyPath:@"dogs.@sum.age"]);//dogs数组中age的总和
        NSLog(@"dogs.age.avg = %@",[p valueForKeyPath:@"dogs.@avg.age"]);//dogs数组中age的平均值
        NSLog(@"dogs.age.max = %@",[p valueForKeyPath:@"dogs.@max.age"]);//dogs数组中age的最大值
        NSLog(@"dogs.age.min = %@",[p valueForKeyPath:@"dogs.@min.age"]);//dogs数组中age的最小值
        
        
        return 0;
    }

    结果:

    2015-03-07 21:09:34.611 KVC&KOC[3079:122638] zhangsan
    2015-03-07 21:09:34.612 KVC&KOC[3079:122638] lisi
    2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age = (
        10,
        20
    )
    2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.sum = 30
    2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.avg = 15
    2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.max = 20
    2015-03-07 21:09:34.613 KVC&KOC[3079:122638] dogs.age.min = 10
    Program ended with exit code: 0
  • 相关阅读:
    Tsql 获取服务器信息
    数据字典生成脚本 【转载】
    c# winform文本框数字,数值校验
    ReentrantLock和AbstractQueuedSynchronizer的分析
    多线程
    前缀和与差分数组
    链表
    堆(优先队列)
    排序算法
    二分查找(递归和非递归)
  • 原文地址:https://www.cnblogs.com/yoran-yang/p/4309725.html
Copyright © 2011-2022 走看看