有一个Person类,Person里面有一个Tiger(为了严重KVC的keypath用),还有一个PersonMonitor观察者类
Person.h
#import <Foundation/Foundation.h>
@interface Tiger : NSObject
@property(nonatomic,strong) NSString *tigerName;
@end
@interface Person : NSObject
@property(nonatomic,strong) NSString *strName;
@property(nonatomic,strong) NSString *strPassword;
@property(nonatomic,strong) Tiger *tiger;
@end
PersonMonitor.m
//
// PersonMonitor.m
// xcyUI
//
// Created by XiangChenyu on 14-4-17.
// Copyright (c) 2014年 XiangChenyu. All rights reserved.
//
#import "PersonMonitor.h"
#import "Person.h"
@implementation PersonMonitor
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqual: @"strName"])
{
NSLog(@"strName-->%@",@"hello");
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
@end
调用结果:
Person* per = [[Person alloc] init];
Tiger *tiger = [[Tiger alloc] init];
per.tiger = tiger;
[per setValue:@"strXX" forKey:@"strName"];
NSLog(@"%@",[per valueForKey:@"strName"]);
[per setValue:@"smalltiger" forKeyPath:@"tiger.tigerName"];
NSLog(@"%@",[per valueForKeyPath:@"tiger.tigerName"]);
PersonMonitor *perMonitoer = [[PersonMonitor alloc]init];
[per addObserver:perMonitoer
forKeyPath:@"strName"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];
[per setValue:@"dd" forKey:@"strName"];
[per removeObserver:perMonitoer forKeyPath:@"strName"];
打印结果: