前情提要:
KVC 和KVO的keyPath一定是属性?
:NO,KVC 默认支持实例变量。一个对象设定为属性,是默认支持KVO的。如果这个对象是一个实例变量,那么就需要我们手动实现KVO了,如下:
#import <Foundation/Foundation.h>
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;
}
网友评论