用Xcode新建一个简单的工程为例:
建一个模型类 Student
在Student.h里面申明一个name 属性
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,copy) NSString *name;
@end
在 ViewController.m 中
#import "ViewController.h"
#import "Student.h"
@interface ViewController (){
Student *_student;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_student = [[Student alloc] init];
_student.name = @"1569";
//KVC -->KEY VALUE CODING<键值编码>
[_student setValue:@"1568" forKey:@"name"];
NSLog(@"%@",_student.name);
//KVO -->KEY VALUE OBSERVER<键值观察者>
//工作原理
//A类有一个属性,同时给A类添加一个观察者B类,当A类的属性发生变化时,B类就会执行一个观察者方法来获取到A类属性发生变化的最新值
//添加一个观察者,
[_student addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
_student.name = @"1567";
}
//B类执行的观察者方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
//A 类的属性变化的值 保存在change里,如果想获取最新值,那么key是new,如果是旧值,那么key是old
NSString *name = [change objectForKey:@"new"];
NSLog(@"Student类的name属性变化的最新值是%@",name);
//假如程序崩了,写如下代码解决奔溃问题
//产生奔溃的原因是 没有移除观察者
[_student removeObserver:self forKeyPath:@"name"];
}