IOS学习笔记八(KVO)

 

1、KVO介绍

 

KVO机制NSKeyValueObserving协议支持,NS遵循了这个协议 ,所以NSObject的子类都可使用协议中的方法,下面方法可以注册监听

添加监听器

addObserver: forKeyPath: options: context:

删除监听

removeObserver: forKeyPath:

//重写下面的方法,当数据发生变化的时候会回调这个函数

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

 

 

 

 

 

2、测试代码

FKItemView.h

#ifndef FKItemView_h
#define FKItemView_h
#import <Foundation/Foundation.h>
#import "FKItem.h"

@interface FKItemView : NSObject
@property (nonatomic, weak) FKItem *item;
-(void)showItemInfo;
@end


#endif /* FKItemView_h */

 

FKItemView.m

 

#import <Foundation/Foundation.h>
#import "FKItemView.h"

@implementation FKItemView
@synthesize item = _item;

-(void)showItemInfo
{
    NSLog(@"item物品名为:%@,物品价格为:%d", self.item.name, self.item.price);
}
//自定义设置item
-(void)setItem:(FKItem *)item
{
    self->_item = item;
//    self.item = item;
    //为item添加监听器,监听item的name属性的改变
    [self.item addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    [self.item addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionInitial context:nil];
    
}
//重写方法,当监听的数据模型发生改变时候,就会回调这个方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"observeValueForKeyPath方法被调用了");
    NSLog(@"被修改的keyPath为:%@", keyPath);
    NSLog(@"被修改的对象为:%@", object);
    NSLog(@"新被修改的属性值为:%@", [change objectForKey:@"new"]);
    NSLog(@"被修改的上下文为:%@", context);
}

-(void)dealloc
{
    [self.item removeObserver:self forKeyPath:@"name"];
    [self.item removeObserver:self forKeyPath:@"price"];
}
@end

 

 

 

main.m

#import "FKItemView.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        FKItemView *itemView = [FKItemView new];
        FKItem *item = [FKItem new];
        itemView.item = item;
        [itemView showItemInfo];
        item.name = @"chencaifeng";
        item.price = 79;
        
    }
}

 

 

 

 

 


3、运行结果

observeValueForKeyPath方法被调用了
被修改的keyPath为:name
被修改的对象为:<FKItem: 0x600000035360>
新被修改的属性值为:chencaifeng
被修改的上下文为:(null)
observeValueForKeyPath方法被调用了
被修改的keyPath为:price
被修改的对象为:<FKItem: 0x600000035360>
新被修改的属性值为:(null)
被修改的上下文为:(null)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码莎拉蒂 .

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值