KVO基础

作者: 我是小胡胡分胡 | 来源:发表于2018-07-16 10:57 被阅读10次

    第一课

    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基础

          本文链接:https://www.haomeiwen.com/subject/biivpftx.html