第一课
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通知方法---无效
网友评论