KVO与KVC

2018-09-28  本文已影响5人  sajiner

KVO

如何得知添加KVO的instance对象的isa指针指向的不是原有的类对象

NSLog(@"person添加kvo之前 - %@", object_getClass(self.person)); /// Person
[self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
NSLog(@"添加kvo之后 - %@", object_getClass(self.person)); /// NSKVONotifying_Person

添加了KVO的instance对象和未添加KVO的对象同是调用属性的set方法,为什么添加KVO的可以触发 observeValueForKeyPath:ofObject:change:context:方法

NSLog(@"person添加kvo之前 - %p", [self.person methodForSelector:@selector(setAge:)]); /// 0x10e3a0250
[self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
NSLog(@"person添加kvo之后 - %p", [self.person methodForSelector:@selector(setAge:)]); /// 0x10e7509e4
(IMP) $1 = 0x00000001084e19e4 (Foundation`_NSSetIntValueAndNotify)

如何手动触发KVO

手动调用willChangeValueForKey:didChangeValueForKey:方法

KVC

使用KVC为属性设置值会触发KVO

上一篇 下一篇

猜你喜欢

热点阅读