//Key Value Obsering (简称:KVO)
//是一种监听机制,视图模型监听数据模型的变化做出相应的反应(对属性的值变化进行监听)
//实现跟观察者模式类似,步骤如下
//1、添加监听
//2、重写监听触发的方法
//3、重写临终遗言(dealloc)在里面移除监听
代码实例
Person.h
#import <Foundation/Foundation.h>
@class Account;
@interface Person : NSObject{
@private int _age;
}
#pragma mark - 属性
#pragma mark 姓名
@property (nonatomic,copy)NSString *name;
#pragma mark 账户
@property (nonatomic,strong) Account *account;
#pragma mark - 公用方法
#pragma mark 显示人员信息
- (void)showMessage;
@end
Person.m
@implementation Person
#pragma mark - 公用方法
#pragma mark 显示人员信息
- (void)showMessage
{
NSLog(@"姓名:%@年龄:%d",_name,_age);
}
#pragma mark 设置人员账户
//使用懒加载
-(void)setAccount:(Account *)account
{
_account = account;
// 给对象中的某个属性添加监听参数:监听者的对象,里面有重写指定方法 监听的属性 监听属性变化的模式 未知
// - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
[_account addObserver:self forKeyPath:@"balance" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
#pragma mark - 覆盖方法
#pragma mark 重写observeValueForKeyPath:方法,当账户的balance发生变化的时候触发
//传进去的参数:keyPath(属性名称) 监听的对象 发生变化的数据(根据监听模式确定里面的值) 内容
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"balance"]) {
NSLog(@"keyPath = %@,object = %@,newValue = %@,context = %@",keyPath,object,change,context);
}
}
#pragma mark 重写销毁方法(临终遗言)
-(void)dealloc
{
[_account removeObserver:self forKeyPath:@"balance"]; //移除监听
//由于是ARC内存管理机制,所以无需调用[super dealloc];
}
@end
#import <Foundation/Foundation.h>
@interface Account : NSObject
#pragma mark - 属性
#pragma mark 余额
@property (nonatomic,assign) float balance;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *person1 = [Person new];
person1.name = @"why";
Account *account = [Account new];
account.balance = 1000000.0;
person1.account = account;
account.balance = 2000.000;
account.balance = 3000;
account.balance = 40000;
}