zoukankan      html  css  js  c++  java
  • KVC/KVO简单实例代码

    Person.h
    #import<Foundation/Foundation.h>
    
    @classAccount;
    
    @interfacePerson :NSObject{
    @private
       int_age;
    }
    #pragma mark -属性
    
    @property(nonatomic,copy)NSString*name;
    @property(nonatomic,retain)Account*account;
    
    -(void)showMessage;
    
    @end
    
    Person.m
    #import"Person.h"
    #import"Account.h"
    
    @implementationPerson
    
    -(void)showMessage{
       NSLog(@"name=%@,age=%d",_name,_age);
    }
    
    #pragma mark设置人员账户
    -(void)setAccount:(Account*)account{
       _account=account;
       //添加对Account的监听
        [_accountaddObserver:selfforKeyPath:@"balance"options:NSKeyValueObservingOptionNewcontext:nil];
    }
    
    #pragma mark重写observeValueForKeyPath方法,当账户余额变化后此处获得通知
    -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context{
       if([keyPathisEqualToString:@"balance"]){//这里只处理balance属性
           NSLog(@"keyPath=%@,object=%@,newValue=%.2f,context=%@",keyPath,object,[[changeobjectForKey:@"new"]floatValue],context);
        }
    }
    
    #pragma mark重写销毁方法
    -(void)dealloc{
        [self.accountremoveObserver:selfforKeyPath:@"balance"];//移除监听
    }
    
    Account.h
    #import<Foundation/Foundation.h>
    
    @interfaceAccount :NSObject
    #pragma mark余额
    @property(nonatomic,assign)floatbalance;
    @end
    
    Account.m
    #import"Account.h"
    
    @implementationAccount
    
    @end
    
    Main调用方法
    - (void)viewDidLoad {
        [superviewDidLoad];
    
    #if0
        Person *person1=[[Person alloc]init];
        [person1 setValue:@"Kenshin"forKey:@"name"];
        [person1 setValue:@28forKey:@"age"];//注意即使一个私有变量仍然可以访问
    
        [person1 showMessage];
       //结果:name=Kenshin,age=28
        NSLog(@"person1's name is :%@,age is :%@",person1.name,[person1 valueForKey:@"age"]);
       //结果:person1's name is :Kenshin,age is :28
    
        Account *account1=[[Account alloc]init];
        person1.account=account1;//注意这一步一定要先给account属性赋值,否则下面按路径赋值无法成功,因为account为nil,当然这一步骤也可以写成:[person1 setValue:account1 forKeyPath:@"account"];
    
        [person1 setValue:@100000000.0forKeyPath:@"account.balance"];
    
        NSLog(@"person1's balance is :%.2f",[[person1 valueForKeyPath:@"account.balance"] floatValue]);
       //结果:person1's balance is :100000000.00
    
    #else
    
       Person*person1=[[Personalloc]init];
        person1.name=@"Kenshin";
    
       Account*account1=[[Accountalloc]init];
        account1.balance=100000000.0;
        person1.account=account1;
    
        account1.balance=200000000.0;//注意执行到这一步会触发监听器回调函数observeValueForKeyPath: ofObject: change: context:
    #endif
    
    }
  • 相关阅读:
    sdk 和 Open API 有什么区别
    分布式锁介绍
    K8s 资源更新机制详解 (ResourceVersion 与 patch)
    Pod 一直处于pending状态但是kubectl describe和logs都没有输出信息的原因
    CAP 理论详解
    kubebuilder中的controller:latest是什么镜像
    Codeforces Round #441 (Div. 1, by Moscow Team Olympiad)
    Matrix Tree 定理及证明
    Codeforces Global Round 15 题解
    Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/mapanguan/p/5477563.html
Copyright © 2011-2022 走看看