定义一个普通的类
1
#import <Foundation/Foundation.h>
#import<UIKit/UIKit.h>
@interface LXXperson : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,assign)CGFloat height;
@end
#import "LXXperson.h"
@implementation LXXperson
-(void)setName:(NSString *)name{
_name =name;
}
@end
2
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#import "ViewController.h"
#import "LXXperson.h"
@interface ViewController ()
@property(nonatomic,strong)LXXperson *p;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//kvo 键值监听 :监听对象属性的改变 如果你改变了 告诉我
LXXperson *p =[[LXXperson alloc] init];
p.name =@"小心";
p.age =18;
p.height=1.78;
self.p =p;
// NSKeyValueObservingOptionNew = 0x01, 新值
// NSKeyValueObservingOptionOld = 0x02, 旧值
//keypath 键路径 key 键
//
[p addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew context:nil];
p.height =1.8;
// p 调用方法 取isa指针指向的类对象方法列表中去找
//系统会自己创建一个名为 NSKVONotifying_CZPerson 是person的子类
/*
就是说,kvc 创建一个person的子类 重写 子类的set方法 做到只要值改变就会调用子类的set方法
子类的set方法里面还要调用父类 的set方法 在子类中[控制器对象 observeValueForKeyPath]
方法会做三件事:1控制器对象的保存 2.参数 保存 3.多态 父类指针指向子类对象 子类往上面调用
这里创建叫NSKVONotifying_CZPerson 子类调用子类的set 改变person 的isa 就是说子类调用自己的set方法 在自己set方法中,再去调用父类的set方法 [supper set];
*/
}
//键值监听 值改变就会调用
/**
* 键值监听 值改变就会调用
*
* @param keyPath 属性
* @param object 对象
* @param change 字典 改变后数据
* @param context 附加参数
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"%@",change);
NSLog(@"%f",self.p.height);
}
//移除监听者
-(void)dealloc{
[self.p removeObserver:self forKeyPath:@"height"];
}
@end
原文:http://www.cnblogs.com/lxlmq412/p/4836313.html