// Student.h
@interface Student : NSObject

@property (nonatomic , assign) NSInteger score;

- (void)changeScore:(NSInteger)score;

@end


// Student.m
#import "Student.h"
@implementation Student
// 改变成员变量的值
- (void)changeScore:(NSInteger)score{
    _score = score;
}

@end

如上所示的Student类有个score属性,通过KVO添加观察者监听score属性后,可以通过下面3中方式来改变score的值,但只有通过.语法KVC赋值这两种方式改变score的值时才会触发KVO。

Student *stu = [[Student alloc] init];
[stu addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionNew context:NULL];

// 通过3中方式改变score
// 方式一:点语法(也就是通过setter方法赋值)
stu.core = 88;

// 方式二:KVC赋值
[stu setValue:@55 forKey:@"score"];

// 方式三:直接更改成员变量的值(不会触发KVO)
[stu changeScore:33];

如果想要第三种方式也能触发KVO的话就需要手动触发,也就是需要将changeScore:方法改成:

- (void)changeScore:(NSInteger)score{

    [self willChangeValueForKey:@"score"];
    _score = score;
    [self didChangeValueForKey:@"score"];
}
//通过属性的点语法间接调用
objc.name = @"";

// 直接调用set方法
[objc setName:@"Savings"];

// 使用KVC的setValue:forKey:方法
[objc setValue:@"Savings" forKey:@"name"];

// 使用KVC的setValue:forKeyPath:方法
[objc setValue:@"Savings" forKeyPath:@"account.name"];