触发KVO的修改变量值方法
// 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"];