4.KVO,KVO,通知之objective-c

来源:互联网 发布:java输出数组全部元素 编辑:程序博客网 时间:2024/06/06 19:24

KVC

    

    [对象 setValueaValue forKeyaKey]//为对象的aKey变量赋值

        aValue = [对象 valueForKeyaKey]//把对象的aKey变量的值取出来

    

    

    [对象 setValueaValue forKeyPathaKeyPath];//设置值

        id aValue = [对象 valueForKeyPathaKeyPath]//取值

        注意:keyPath里边的变量!aKeyPath p.name之类的(可以很多点)

    

    

    Demo

        

        Student *stu = [[Student alloc]init];

        [stu setValue:@"张三"forKey:@"name"];//对对象变量赋值

        NSString s1 = [stu valueForKey:@"name"];//变量值取出

        [stu release]

    

    

    

KVO

    

    1、注册监听

    

        [被监听对象  addObserver监听者 

         forKeyPath被监听对象的属性 

         options:监视内容(新值或旧值)

         context:额外信息]

    

    

    2、监听者实现监听方法(在监听者的类里面实现,不实现会崩溃)

    

        -(void)observerValueForKeyPath:(NSString*)keyPath ofObject:(id)object (被监听对象) change(NSdictionary*)change(所监对象属性变化) context:(void*)context

    

    

    3、监听触发条件

    

       被监听对象的属性发生变化时 //自动调用下面的方法 

    

    Demo:

        

            -voidobserverValueForKeyPath:(NSString*)keyPath  ofObject:(id)object change:(NSDictionary*)change context:(void*)context

        {

        NSLog:(@"keyPath:%@ object:%@ change:%@ context:%@ ",keyPath,object,change,context);  //可以在这方法里实现想做的事 比如发送通知

        }

        

        Student *stu = [[Student alloc]init];

        stu.name = @"张三"

        stu addObserver self forKeyPath :@"name" options:NSKeyValueObservingOptionNew context:nil;

        stu.name = @"李四";  //值改变调用方法

        stu.name = @"王五"//值改变有调用方法

        stu release;

    

通知

        

    1、获得通知中心对象

    

        NSNotificationCenter *center= [NSNotificationCenter defaultCenter];  //单例实际是获得通知中心的地址

    

    

    2、监听通知

    

        [center addObserver :监听者 selector:须执行的方法 name:所监听者通知的名称 object:通知发送者];

    

    3、通知中心发布消息

    

        [center PostNotificationName@"国王万岁" object:某人]

    

    4.移除监听中心

    

        [center removeObserver:self name:@"国王万岁" object:某人];

    

    

    

    Demo:

    

        King *king = [[King alloc]init]

        Farmer *farmer = [[Farmer alloc]init]

        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

        [center addObserver:farmer selector:@selector(test:) name:@"国王万岁" object:king]

        [center postNotificationName:@"国王万岁" object:king]

        [center removeObserver:farmer]

        [king release];

        [farmer release];

        

        -(void)test:(NSNotification*)n //方法必须实现在监听通知的类里面 做想做的事

        {

           NSLog(@"name:%@ object:%@ userInfo:%@",[nname],[nobject],[n userInfo]);

        }