美文网首页
Object-C kvo要注意

Object-C kvo要注意

作者: Taureau_2d81 | 来源:发表于2017-05-31 19:44 被阅读0次

非常重要

当你在同一个ViewController中添加多个KVO的时候,无论哪个KVO都是走- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context;回调方法.所以需要对想要的监听对象进行区分,以便指定不同的逻辑.

这里是对_tableView对象的contentOffset属性监听.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _tableView && [keyPath isEqualToString:@"contentOffset"]) { [self doSomething]; } }

我们假设当前类(在例子中为UITableViewController)还有父类,并且父类也有自己绑定了一些其他KVO呢?我们看到,上述回调函数体中只有一个判断,如果这个if不成立,这次KVO事件的触发就会到此中断了。但事实上,若当前类无法捕捉到这个KVO,那很有可能是在他的superClass,或者super-superClass...中,上述处理砍断了这个链。合理的处理方式应该是这样的:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _tableView && [keyPath isEqualToString:@"contentOffset"]) { [self doSomethingWhenContentOffsetChanges]; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } }

但是这个是要自己搞清楚,父类中到底有没有注册KVO.如果监听一个对象的两个属性,两个属性的改变时分开执行的,就会触发两次代理方法.如图:

1.png

KVO的一个特性,当对同一个keyPath进行多余一次的removeObserver的时候会导致程序crash.这种情况常常出现在父类有一个kvo,父类在dealloc中remove了一次,子类又remove了一次的情况下。

解决办法就是我们可以分别在父类以及本类中定义各自的context字符串,这样iOS就能知道移除的是自己的kvo,而不是父类中的kvo,避免二次remove造成crash.

把监听到对象的属性值改变赋值的时候,一定要注意监听对象的值的类型.

相关文章

  • Object-C kvo要注意

    非常重要 当你在同一个ViewController中添加多个KVO的时候,无论哪个KVO都是走- (void)ob...

  • KVO&KVC

    什么是KVO? KVO是key-value observing的缩写 KVO是Object-C对观察者设计模式的又...

  • KVO/KVC

    什么是KVO KVO是Key-Value Observing的首字母缩写 KVO是Object-C对观察者设计模式...

  • KVO/KVC

    KVO是key-value observing的缩写kvo是object-c对观察者模式的又一实现apple使用了...

  • Object-c之KVO

    KVO也是Object-c里重要的一个东西。 他的原理比较复杂,说来也话长。大概的意思是,当一个类需要观察一个属性...

  • Object-C KVC、KVO、通知

    一、KVC(key value code)的基本概念和用法 1、基本概念 1)键-值编码是一个用于间接访问对象属性...

  • Object-C中KVO探索

    什么是KVO KVO(Key-Value Observing),俗称键值监听。它提供一种机制,当指定的对象的属性被...

  • 今日头条面试题

    1、kvo底层实现cell中一个点赞功能如果用kvo需要注意什么?(提示涉及cell复用问题) 关于TableVi...

  • Swift的kvo

    Swift的kvo有两种方式第一种,直接用oc的kvo,但是需要注意的是1.class必须继承NSObject2....

  • 自定义KVO的一些错误使用方式

    很多时候我们讲KVO,使用的时候需要注意移除监听,循环引用等问题,但是在自定义KVO的时候,却容易忽视几个问题。 ...

网友评论

      本文标题:Object-C kvo要注意

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