NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)

NSNotificationCenter

//下面是不同类中需要实现的代码

1.[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sender:) name:@"刘冠" object:nil];//通知接收者(监听者)

-(void) sender:(NSNotification *)input

{

    NSLog(@"%@",input.object) ;

}

//引用计数为0的情况下,当内存回收时会调用dealloc(C++析构函数,做最后的内存清理工作)方法

- (void)dealloc

{   

  [[NSNotificationCenter defaultCenter] removeObserver:self name:@"刘冠" object:nil];//要移除该通知监听

}

2.[[NSNotificationCenter defaultCenter] postNotificationName:@"刘冠" object:@"刘冠"];//通知发送者(被监听者)

通知的发送者可以为系统中已定义过的,我们只需注册监听,例如视频播放类MPMoviePlayerViewController中的暂停按钮,只需注册即可,例如

 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fanction) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];监听视频停止

 

kvc与kvo(键值编码 键值观察)

 

#import <Foundation/Foundation.h>
#import "Teacher.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *student = [[Student alloc]init];
        student.name = @"liuguan";
        student.age = @"30";
//一个非正式的 Protocol,提供一种机制来间接访问对象的属性
//        [student setValue:@"liuguan" forKey:@"name"];//kvc
//        [student setValue:@"30" forKey:@"age"];//kvc
        
        Teacher *teacher = [[Teacher alloc]init];
        [teacher listening:student];
        
//        [student setValue:@"liuguanNew" forKey:@"name"];//kvc
//        [student setValue:@"33" forKey:@"age"];//kvc
        student.name = @"liuguanNew";
        student.age = @"32";

    }
    return 0;
}
#import "Teacher.h"

@implementation Teacher
//Key-Value Observing (KVO) 它能够观察一个对象的 KVC key path 值的变化。举个例子,用代码观察一个 Student 对象的 name、age 变化,
- (void)listening:(Student *)stu
{
    _s = stu;//指向同一块地址
    //给对象的的属性添加监听(注册)
     //第一个stu代表被观察对象,第二个 self 要成为观察者的对象,第三个:被观察者对象属性的名字,第四个代表改变前后的值,最后一个直接设置nil
    [stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil] ;
    [stu addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil] ;
}
//只有被监控的值重新被赋值时,才调用此方法
//第一个形参keypath代表被观察者对象属性的名字,通过该参数可以判断是哪个属性发生了改变,参数二:被观察者对象 参数三:改变前后的值的字典
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"Path%@",keyPath);
    NSLog(@"Object%@",object);
    NSLog(@"change%@",change);
    NSLog(@"contex%@",context);
}
//引用计数为0的情况下,当内存回收时会调用dealloc(C++析构函数,做最后的内存清理工作)方法
-(void)dealloc{
    [_s removeObserver:self forKeyPath:@"age"];//移除
    [_s removeObserver:self forKeyPath:@"name"];//移除}
}
@end

 

posted @ 2015-11-23 15:40  刘冠  阅读(229)  评论(0编辑  收藏  举报