IOS学习之初识KVO

什么是KVO?

     KVO(Key-Value Observing)键值观察,是一种通过对对象的某一个属性添加观察者,一旦这个属性值发生变化,就会通知当前观察者的一种机制。

该如何使用?

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

 [object addObserver:self forKeyPath:key options:NSKeyValueObservingOptionNew context:nil];

参数说明:     

      object:被观察的对象

      observer:观察者对象

      keyPath:被观察对象的属性名称

     NSKeyValueObservingOptions:有4个值

                      NSKeyValueObservingOptionNew 监听它的新值

                      NSKeyValueObservingOptionOld  监听它的旧值

                      NSKeyValueObservingOptionInitial 监听初始化

                      NSKeyValueObservingOptionPrior 分2次调用。监听旧值和新值

      context: 可以带入一些参数,任何类型都可以,强制转就可以。

2.实现回调函数

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"keyPath---->%@ change--->%@",keyPath,change);
}

参数说明:

      keyPath:被观察对象的属性名称

      object:被观察的对象

      change:新值或者旧值

     context:对应的context

3. 移除观察

 [object removeObserver:self forKeyPath:@"name"];

参数说明:

     object:被观察的对象

     observer:观察者对象

     keyPath:被观察对象的属性名称      

     写个测试程序测试一下:

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @private
       NSString *address;
    
}


@end

Person.m

#import "Person.h"
#import "Car.h"

@interface Person ()

@property (nonatomic ,strong) NSString *name;

@property (nonatomic,strong)Car *car;

@end

@implementation Person

-(id)init
{
    self=[super init];
    if(self){
        self =[super init];
        self.car=[[Car alloc]init];
    }
    return self;
}


@end

Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject

@end

Car.m

#import "Car.h"

@interface Car()

@property (nonatomic ,strong) NSString *brand;

@end

@implementation Car

@end

测试代码:

//添加KVO观察者
-(void)addObserver
{
    [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:@"haha"];
    
    [self.person addObserver:self forKeyPath:@"address" options:NSKeyValueObservingOptionNew context:nil];
    
    [self.person addObserver:self forKeyPath:@"car.brand" options:NSKeyValueObservingOptionNew context:nil];
}

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"keyPath---->%@ change--->%@",keyPath,change);
}

//移除KVO观察者
-(void)removeObserver
{
    [self.person removeObserver:self forKeyPath:@"name"];
    [self.person removeObserver:self forKeyPath:@"address"];
    [self.person removeObserver:self forKeyPath:@"car.brand"];
}

 

转载于:https://www.cnblogs.com/whoislcj/p/5502933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值