成员变量没有手动添加setter方法,使用KVC赋值为什么会触发KVO?
来源:4-10 KVC相关面试问题

慕尼黑6324595
2019-03-20
#import <Foundation/Foundation.h>
@interface MObject : NSObject
{
int _value;
}
@end
@implementation MObject
- (id)init
{
self = [super init];
if (self) {
_value = 0;
}
return self;
}
@end
@interface MObserver : NSObject
@end
@implementation MObserver
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([object isKindOfClass:[MObject class]] &&
[keyPath isEqualToString:@"value"]) {
// 获取value的新值
NSNumber *valueNum = [change valueForKey:NSKeyValueChangeNewKey];
NSLog(@"value is %@", valueNum);
}
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
MObject *obj = [[MObject alloc] init];
MObserver *observer = [[MObserver alloc] init];
//调用kvo方法监听obj的value属性的变化
[obj addObserver:observer forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];
[obj setValue:@2 forKey:@"value"];
}
return 0;
}
这样调用KVC为什么能触发KVO?
写回答
3回答
-
杰西大叔
2020-03-30
验证了一下,对于没有setter方法的合法属性,kvc会自己给属性赋值,赋值的时候调用的是 _NSSetValueAndNotifyForKeyInIvar 看名字不难理解,边赋值边通知值的变化,方法里面调用了willChangeValueForKey 和 didChangeValueForKey 这样kvo就接上了。
012021-10-08 -
闲逛的蚂蚁
2019-08-17
我也有此疑问,按照setValue:ForKey:方法内部的处理流程,在判断没有setter方法之后,应该是直接会通过实例变量进行赋值,那通过实例变量直接赋值应该不会触发KVO的回调才对啊,求解答~
022019-09-11 -
于海
2019-03-22
看课程中关于kvc的原理介绍
00
相似问题