• 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
  • 相关阅读:
    Python微信机器人
    Jumpserver开源跳板机系统介绍
    Django---django-rest-framework(drf)-luffycity projects
    Linux-Mysql 遗忘密码如何解决?
    up line
    linux
    vue中computed(计算属性)
    input框在浏览器上显示一个叉,去掉方法
    如何通过命令行来克隆git
    手机抓包fiddler配置及使用教程
  • 原文地址:https://www.cnblogs.com/liuguan/p/4988645.html
Copyright © 2020-2023  润新知