• KVO


    /*KVO 键值观察对象和对象之间传递消息

     一,概述

     KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

     二,使用方法

     系统框架已经支持KVO,所以程序员在使用的时候非常简单。

     1. 注册,指定被观察者的属性,

     2. 实现回调方法

     3. 移除观察*/

    //person

    #import <Foundation/Foundation.h>

    #import "BankCount.h"

    @interface Person : NSObject

    {

        BankCount *aBankCount;

    }

    - (void)registerABankCount;//打开监听银行账号的能力

    @end

    #import "Person.h"

    @implementation Person

    - (id)init

    {

        if (self = [super init]) {

            

            aBankCount = [[BankCountalloc] init];

        }

        returnself;

    }

    // Yu_e指向自己的指针

    static void *Yu_e = (void *)&Yu_e;

    - (void)registerABankCount

    {

        //监听银行账号的变化过程

        [aBankCountaddObserver:selfforKeyPath:@"yu_e"options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:Yu_e];

        //移除监听

        //[self removeObserver:object forKeyPath:@"yu_e"];

        //aBankCount增加一个监听者 self 去监听:yu_e

        //只要yu_e有变化就会让self知道

    }

    //监听的回调函数

    //只要aBankCountyu_e有变化就会调用

    //keyPath就是之前监听的yu_e

    //object就是aBankCount

    //change是一个字典里边包含了新、旧值

    //context是一个私有变量Yu_e

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

    {

        if (context == Yu_e) {

            NSString *str = [change objectForKey:NSKeyValueChangeNewKey];

            NSLog(@"str = %@",str);

        }

        else

        {

            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

        }

    }

    //BankCount

    #import <Foundation/Foundation.h>

    @interface BankCount : NSObject

    @property (nonatomic, assign) float yu_e;

    @end

    #import "BankCount.h"

    @implementation BankCount

    - (id)init

    {

        self = [super init];

        if (self) {

            [NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(yu_eUpdate:) userInfo:nilrepeats:YES];

        }

        returnself;

    }

    - (void)yu_eUpdate:(id)arg

    {

        float f = self.yu_e;

        f += arc4random() % 100;

        self.yu_e = f;//1、不能_yu_e = f;

        

        [self setYu_e:f];//2

        

        [selfsetValue:[NSNumbernumberWithFloat:f] forKey:@"yu_e"];//3

        

        [selfwillChangeValueForKey:@"yu_e"];//4

        _yu_e = f;

        [selfdidChangeValueForKey:@"yu_e"];

    }

    @end

    //调用

    Person *p = [[Person alloc] init];

    [p registerABankCount];

    [[NSRunLoop currentRunLoop] run];

  • 相关阅读:
    Git远程仓库的使用(github为例)
    SQL查看数据库中每张表的数据量和总数据量
    HTML简单的注册页面搭建
    java新建日期获取工具
    ArrayList的使用方法技巧(转载)
    UI初级 TextField
    UI初级 Label
    UI入门 纯代码 第一节 UIWindow, UIView
    C 入门 第十一节
    secoclient安装mac版提示系统配置文件写入失败的解决方案
  • 原文地址:https://www.cnblogs.com/chenhaosuibi/p/3442536.html
Copyright © 2020-2023  润新知