手动设定实例变量的KVO

前情提要:
KVC 和KVO的keyPath一定是属性?
:NO,KVC 默认支持实例变量。一个对象设定为属性,是默认支持KVO的。如果这个对象是一个实例变量,那么就需要我们手动实现KVO了,如下:

#import 

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject
{
    NSString *_age;
}

- (void)setAge:(NSString *)age;
- (NSString *)age;
@end

NS_ASSUME_NONNULL_END
//手动设定KVO
- (void)setAge:(NSString *)age {
    [self willChangeValueForKey:@"age"];
    _age = age;
    [self didChangeValueForKey:@"age"];
}

- (NSString *)age {
    return _age;
}

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    BOOL isBool = [super automaticallyNotifiesObserversForKey:key];
    //如果监听到键值为age,则指定为非自动监听对象
    if ([key isEqualToString:@"age"]) {
        isBool = NO;
    }
    return isBool;
}

你可能感兴趣的:(手动设定实例变量的KVO)