zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/liuguan/p/4988645.html
Copyright © 2011-2022 走看看