美文网首页
为啥好多人说OC中的KVO很难用?

为啥好多人说OC中的KVO很难用?

作者: 音视频直播技术专家 | 来源:发表于2018-07-01 01:01 被阅读175次
KVO.jpg

前言

听到很多同学说iOS中的 KVO是最难使用的一项技术,要尽量避免。通过我的观察,其实并不是 KVO难用,而是很多做 OC 的同学见到指针就发怵,因为一旦使用不好就会引起Crash。

我们在开发RTC项目时,由于需要侦听iOS手机的音量键,然后根据音量的大小做一些逻辑处理,所以也要用 KVO。下面我就来介绍一下OC中的KVO,看看它真的有很么可怕吗?

KVO的基本原理

KVO(Key - Value - Observer),其实就是一种观察者模式的实现。

当一些对象想侦听某个被观察对象的事件时候,首先需要将侦听对象注册到被侦听对象的管理列表中,当被侦听对象发生变化时,它会调用管理列表中的每一个侦听对象的指定方法来通知侦听对象。

KVO与一般的观察者模式的不同之处在于,它还可以通知被侦听对象的每个方法的变化。它是如何做到的呢?通过官方文档的介绍我们可以知道其原理也非常的简单:

在注册 KVO时,编译器会帮着创建一个被侦听对象的子类。而对于被侦听的方法,编译器会在调用方法前/后增加一些代码,其作用就是在方法被调用时通知侦听对象。

通过上面的描述大家应该就清楚了,实际KVO就是一种观察者模式的具体实现。了解了这个基本原理后,我们看看如何使用 KVO呢?

使用KVO的步骤

KVO的使用非常的简单,通过以下几个步骤就可以了:

  • 向被监听对象注册一个侦听对象,并告之你想侦听的方法。如下所示:
[session addObserver:volume
          forKeyPath:@"outputVolume"
             options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
             context:nil];

上面的代码中, volume是一个NSObject对象或它的子类的对象。forKeyPath代表你要侦听的对象的方法是什么,这里是 outputVolume方法。

  • 在侦听对象中实现侦听到事件后的处理方法。
- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
    ......
}
  • 移除监听对象。
[session removeObserver:volume
             forKeyPath:@"outputVolume"];

没错,使用 KVO就这三个步骤,非常的简单。

KVO的坑

KVO使用起来非常的简单,不过KVO很常容易引起各种Crash, 都在哪些情况下会引起 Crash呢?

  • 调用 removeObserver 两次,会产生NSRangeException类型的Crash。也就是要删除的对象找不到了,iOS认为这是异常,后果很严重,所以直接让程序Crash.

  • 侦听对象被销毁了,但没有remove,也会产生Crash。这个好理解,因为在被侦听对象里存放着侦中对象的指针,当侦听对象不存在时,被侦听对象中存放的就是野指针了。访问野指针肯定要Crash呀!

小结

通过上面的介绍我们可以知道,KVO就是一种观察者模式的具体实现。它使用起来非常简单,只需要三步即可完成。
但它很容易引起Crash,如何避免因使用KVO导致Crash呢?最好的办法就是在侦听对象的构造函数/初始化函数中注册KVO,在析构/反初始化函数中删除KVO。使它们始终配对出现,这样就不会出现Crash了。

相关文章

  • 为啥好多人说OC中的KVO很难用?

    前言 听到很多同学说iOS中的 KVO是最难使用的一项技术,要尽量避免。通过我的观察,其实并不是 KVO难用,而是...

  • swift中KVO和属性观察器

    开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式...

  • KVO

    今天和大家讨论一下OC中KVO(KeyValueObserving)键值观察 KVO定义 KVO是iOS开发中的一...

  • iOS KVO实现细节验证

    验证 KVO objective-c 中的 kvo 是观察者模式的一种oc实现。 不管使用方式了,直接看看kvo是...

  • OC知识点整理-(零)内容概要

    我们在OC中基础中,尝尝会被问到下面几个基础方面的问题。 OC基础 Category 关联对象 代理,通知 KVO...

  • iOS KVO的底层实现原理

    KVO 是 OC 观察者设计模式的一种KVO 的实现依赖于 OC 强大的 RuntimeKVO是Cocoa提供的...

  • OC的KVO学习记录(2)

    仿写KVO的实现KVO原理参考可前一篇OC的KVO学习记录代码github地址:Sameny仿写KVO 注:关键代...

  • iOS知识点小结

    1.KVO1.1> KVO 简介:KVO 是 OC 观察者设计模式的一种实现.KVO 指定一个被观察的对象的属性,...

  • OC观察者模式之KVO

    KVO: KVO是key-value observing的缩写 KVO是OC对观察者设计模式的又一实现 苹果使用了...

  • KVO & KVC 学习

    前言 在 OC 的学习过程中,KVO 和 KVC 是我们经常提到的。我一直没有很清楚的搞明白 KVC 是个啥。今天...

网友评论

      本文标题:为啥好多人说OC中的KVO很难用?

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