iOS KVC 和KVO的真正理解
2015-01-08 20:41
148 查看
Key Value Coding
Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property accssor, 如我们有个property叫做foo, 我们可以foo直接访问它,同样我们也可以用KVC来完成[Object valueForKey:@“foo”], 有同学就会问了, 这样做有什么好处呢?主要的好处就是来减少我们的代码量。下面我们来看看几个例子,就明白了KVO的用法和好处了,假设这样个类叫做People,
是否有种简单办法来设置这样的属性,当然就是我们的KVC了。
Key,还是用setValuesForKeysWithDictionary就会 抛出异常。
把它wrapper成我们需要的class
针对这些collection里面的元素进行操作,同样KVC也提供更多地操作,例如@sum这些针对collection,有兴趣的同学可以去用下。
场景4,当我们执行NSArray *products = [people valueForKey:@“products”],我们希望的是[people products],可是people没有这样的方法, KVC又会为我们带来些什么呢?
首先会去找getProdcuts or products or isProducts, 按照这样的顺序去查找,第一个找到的就返回
然后会去找countOfProducts and either objectInProductsAtIndex: or ProductsAtIndexes, 如果找到,就会去找countOfProducts and enumeratorOfProducts and memberOfProducts 这个2个方法都找到了,KVC才会给我们返回一个代理的NSKeyValueArray,用于我们后续的操作(addProduct之类的)。
如果有个变量叫做 products, isProducts, products or isProducts, KVC会直接就使用这样的变量,如果你觉得直接用这样的变量是破坏了封装, 可以禁止这样的行为发生,重载 +accessInstanceVariablesDirectly,返回NO。
简单来说,valueForKey, 会给我们带来一个代理array, 如果我们实现了某些方法,上诉的这些方法只是针对NSArray, 对于mutable的collection, 我们还需要提供其他 方法的实现才行。
Key Value Observing
Key Value Observing, 顾名思义就是一种observer 模式用于监听property的变化,KVO跟NSNotification有很多相似的地方, 用addObserver:forKeyPath:options:context:去start observer, 用removeObserver:forKeyPath:context去stop observer, 回调就是observeValueForKeyPath:ofObject:change:context:。接着生成的addObserver的class, 就接受到了上一个observer该监听的事件,所以造成了错误,那时候的解决方案是为addObserve key做unique,不会2次addObserver 的key是相同的,但是有了KVO, 我们同样可以用KVO来完成,当addOberver的的object remove的时候,就不会有这样的callback被调用了。
KVO给我们提供了更少的代码,和比NSNotification好处,不需要修改被观察的class, 永远都是观察你的人做事情。 但是KVO也有些毛病, 1. 如果没有observer监听key path, removeObsever:forKeyPath:context: 这个key path, 就会crash, 不像NSNotificationCenter removeObserver。 2. 对代码你很难发现谁监听你的property的改动,查找起来比较麻烦。 3. 对于一个复杂和相关性很高的class,最好还是不要用KVO,
就用delegate 或者 notification的方式比较简洁。
Summary
尽量使用KVC可以大大地减少我们的代码量,当遇到property的时候,可以多想想是否可以KVC来帮助我,是否可以用KVC来重构代码, 当需要加入observer模式时,可以考虑下KVO, 在高性能的observer里面,KVO会给我们很好的帮助。
相关文章推荐
- KVC,KVO的一些原理理解与使用介绍
- Notification,Delegate,KVO,Block的浅易理解
- 你是否真正理解了protected的作用范围呢?
- php中引用&的真正理解-变量引用、函数引用、对象引用
- 全面理解虚拟DOM,以及通过diff算法实现真正的虚拟DOM操作
- 中国IT行业的悲哀,请理解IT行业“资深”的真正含义
- iOS KVC和KVO
- KVC 与 KVO 理解
- 探索 .git 目录,让你真正理解 git
- 真正理解java wait notify
- (转)探索 .git 目录,让你真正了理解git
- 深入理解HashMap(及hash函数的真正巧妙之处)
- 深入理解HashMap(及hash函数的真正巧妙之处)
- 真正理解 git fetch, git pull 以及 FETCH_HEAD
- 深入理解KVC与KVO
- KVC 与 KVO 理解
- 转:KVC 与 KVO 理解
- 真正理解 git fetch, git pull 以及 FETCH_HEAD
- KVC 与 KVO 理解
- Android状态栏微技巧,带你真正理解沉浸式模式