KVO
Posted lanht
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVO相关的知识,希望对你有一定的参考价值。
KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变
原理
利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
_NSSetXXXValueAndNotify的内部调用如下调用willChangeValueForKey:
调用原来的setter实现
调用didChangeValueForKey;didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法
相关问题
ios用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
答:如上- 如何手动触发KVO?
当 +(BOOL)automaticallyNotifiesObserversForKey:(NSString )key 返回是 YES,那么注册的这个 Key 就会替换对应的 Setter ,从而在改变的时候调用 -(void)willChangeValueForKey:(NSString )key 与 -(void)didChangeValueForKey:(NSString *)key 发送通知给观察者。
那么只要把自动通知设为 NO,并代码实现这两个通知方法,就可以达到手动触发的要求。
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
if ([key isEqualToString:@"object"])
return NO;
return [super automaticallyNotifiesObserversForKey:key];
- (void)setObject:(NSObject *)object
if (object != _object)
[self willChangeValueForKey:@"object"];
_object = object;
[self didChangeValueForKey:@"object"];
- 直接修改成员变量会触发KVO么?
答:不会
以上是关于KVO的主要内容,如果未能解决你的问题,请参考以下文章