KVO基础

第一课

1,当属性增加观察者后,属性重新赋值,就会触发kvo消息
实现原理是重新修改了实例的isa,子类中重写了setter方法,在setter方法中调用willChangeValueForKey和didChangeValueForKey,触发通知消息的回调。
willChangeValueForKey对应NSKeyValueObservingOptionOld
didChangeValueForKey对应NSKeyValueObservingOptionNew

2, 通过重写原类的automaticallyNotifiesObserversXXX方法可以禁用willChangeValueForKey和didChangeValueForKey的自动调用,达到关闭自动触发的作用。这时,需要手动这两个方法,做手动触发通知消息的回调。

3,注册依赖键
修改依赖键,会触发kvo
并且原被观察键值,即使关闭了自动触发,也会因为依赖键的修改,得到通知

4,崩溃问题。---iOS11不需要手动移除观察者了
iOS8, iOS 9,iOS10 仍然需要手动移除
An instance 0x7fe438582ae0 of class KVOCreatedViewController was deallocated while key value observers were still registered with it

第二课

主要测试,没有kvo观察能力的属性, 变成可观察;
如果一个属性是只读的, 没有setter方法, 是不支持kvo的

UIWebView和WKWebView 属性同样都是只读的,没有Setter方法
那为什么WKWebView的属性是可以注册观察者的呢, 怎么实现?

is key-value observing (KVO) compliant for this property --这个属性是支持检查观察的。

1, UIWebView

 @property (nonatomic, assign, readonly, getter=canGoBack) BOOL canGoBack
 @property (nonatomic, assign, readonly, getter=isLoading) BOOL loading
 - (BOOL)canGoBack
 - (BOOL)isLoading

2,WKWebView

 @property (nonatomic, assign, readonly) BOOL canGoBack
 @property (nonatomic, assign, readonly, getter=isLoading) BOOL loading
 - (BOOL)canGoBack
 - (BOOL)isLoading

猜测:
1,重写automaticallyNotifiesObserversForKey,打开自动触发--无效
2,增加依赖键,用修改依赖键的值, 间接去触发原属性的kvo通知方法---无效

你可能感兴趣的:(KVO基础)