美文网首页
自定义KVO的一些错误使用方式

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

作者: 码农苍耳 | 来源:发表于2017-10-07 21:28 被阅读21次

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

@interface KVOObject : NSObject

@property (strong, nonatomic) NSString *a;
@property (strong, nonatomic) NSString *b;
@property (strong, nonatomic) NSString *c;

@end

@implementation KVOObject
@dynamic c;

- (void)setB:(NSString *)b {
    
}

- (void)setC:(NSString *)c {
    [self willChangeValueForKey:@"c"];
    [self didChangeValueForKey:@"c"];
}

- (NSString *)c {
    return nil;
}

@end

如果是上述对象,分别对a,b,c监听,其结果是怎么样的呢?

结果是a是正常的,b触发一次,但是其变化的结果都是nil,c触发2次,其结果都是nil。我们来分析下这样的结果吧。

首先,系统KVO的实现是什么?是自动创建一个虚拟对象,并重写set方法,那么这就和这个属性是不是真的存在实现(比如空,或者associate object)无关了。所以当我们再次去调用willChangeValueForKeydidChangeValueForKey就产生了2次调用,很多在set方法中再次重申变化是一个错误。

那么我们什么时候需要用到这两个方法呢?当在非set方法里面,通过非set方法变更了属性的值时,就需要手动去触发了。这包括了self->_a这样的调用。

然后,KVO变化的值是怎么取出来的呢?依据willChangeValueForKey的接口来看,并没有传入值的参数,那么显而易见,值是从get方法中取出来的。所以如果set和get方法不是对称的,比如- (id)c所返回的并不是对应c的内容,可能就会出现一些问题,变化的时候并没有触发KVO,触发KVO的时候内容并没有变化。

以上两个在平时碰到的应该比较少,比较自己自定义KVO的场景就比较少。

相关文章

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

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

  • KVO基本使用

    分三部分解释KVO一.KVO基本使用二.KVO原理解析三.自定义实现KVO 一、KVO基本使用 使用KVO,能够非...

  • 自定义KVO,自动释放,监听多个属性

    自定义的 KVO,支持多属性监听,支持自动释放。 使用系统 KVO 监听属性 先来回顾下系统 KVO 是如何使用的...

  • 自定义KVO

    上篇文章KVO我们探究了KVO的一些使用方法和其原理,今天我们来自定义一个KVO。首先我们创建一个NSObject...

  • KVC/ KVO

    1、kvc原理: 45页 2、自定义KVO KVO参考链接 KVO默认观察setter,使用isa-swizzli...

  • KVO原理探究+自定义KVO实现

    概念 基本使用 触发模式 属性依赖 容器类的使用 自定义KVO 概念 KVO全称Key-Value Observi...

  • RxSwift:KVO监听对象属性

    在观察某个属性是否变化的时候,采用 KVO 的方式更为简单直接一些。 关于 Swift 的 KVO 使用方法,可以...

  • 31. 自定义错误

    31. 自定义错误 使用 New 函数创建自定义错误 创建自定义错误最简单的方法是使用 [errors]包中的 [...

  • 20.iOS底层学习之KVO 原理

    本篇提纲1、KVO简介;2、KVO的使用;3、KVO的一些细节;4、KVO的底层原理; KVO简介 KVO全称Ke...

  • iOS底层原理总结 - 探寻KVO本质

    问题iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)如何手动触发KVO 首先需要了解KVO基本使用...

网友评论

      本文标题:自定义KVO的一些错误使用方式

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