`
mmdev
  • 浏览: 13469937 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

KVC与KVO的用处

 
阅读更多

在刚刚学习KVC时,我感觉这个东西非常奇怪:它完全可以用"."操作符替代,而且"."更加简单方便。为什么还会有这样一个东西呢?

说起来,KVC的作用还真不大,但在特定的情境下,它还是有一些用处的,我现在发现它的用处主要有两个方面。

一,它可以动态地访问特性。

这句话不好理解,举个例子吧。现在有许多字母,我们要统计某个字母有没有出现。这些字母被存储在一个NSArray里,遍历Array,当遇到"a"这个字母时,就将一个名为"a"的属性设为@"yes",即:

if(letter isEqualToString:@"a")
    self.a=@"yes";
if(letter isEqualToString:@"b")
    self.b=@"yes";
...
这种方式实在比较蛋疼,代码质量比较差劲。如果用了KVC的方式,就比较好看了。

[self setValue:@"yes" forKey:s];
这样,就能动态地处理数据了。

二,它可以支持KVO,即Key-Value Observation,即监视属性的变化并进行一些操作。

使用过UITableView的人一定知道,当对TableView的数据源进行修改时,比如增加一条数据,需要刷新TableView。如果在许多地方进行修改,则需要不断刷新,实在是比较麻烦。

我们可以使用KVO的方法,在数据源改变之后,自动重新加载TableView。假如一个TableView是从array这个属性中获取并组织数据的,那么我们可以添加一句话:

[self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
然后加入一个方法,用来定义接到变化后处理的方式:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"array"]) {
        [self.tableView reloadData];
    }
}
这样,系统就能够在self.array发生变化时自动刷新tableView了。

不过使用KVO有一个比较讨厌的地方,当接收者tableView被销毁时,也要同时取消监听:

[self removeObserver:self forKeyPath:@"array"];
如果不这样的话,在array改变时,就会报错。

不过,即使有这样讨厌的地方,KVO仍然不失为一个有用的工具。


总体来看,我觉得KVC的作用仍然不太大,基本上属于食之无味,弃之可惜的鸡肋。

分享到:
评论

相关推荐

    Cocoa编码规范

    7. **KVC与KVO** - 在使用Key-Value Coding(KVC)和Key-Value Observing(KVO)时,确保遵循相应的命名规则。 - 对于KVC,键路径应为属性名,对于KVO,需在属性声明时使用`@dynamic`或`@synthesized`。 8. **GCD...

    Addison-Wesley Professional] Programming in Objective-C 6th Edition.zip

    8. **NSObjects与KVC/KVO**:讲解Objective-C中最基础的NSObject类,以及Key-Value Coding (KVC)和Key-Value Observing (KVO)这两项强大的属性绑定技术。 9. **面向协议编程**:Objective-C的协议不仅用于定义接口...

    ios代码规范_方法注释

    7. **KVC与KVO**:在使用Key-Value Coding(KVC)和Key-Value Observing(KVO)时,确保遵循最佳实践,防止潜在的问题。 8. **GCD**:合理使用Grand Central Dispatch(GCD)来处理异步任务,确保线程安全。 9. **...

    苹果Cocoa编码规范(中文版)

    6. **KVC(Key-Value Coding)和KVO(Key-Value Observing)**:Cocoa提供了KVC和KVO机制,用于动态访问对象属性和监听属性变化。遵循KVC兼容性原则,类的属性应能响应KVC操作,如`valueForKey:`和`setValue:forKey:...

    iphone面试题秘籍 apple开发必备

    5. **KVC与KVO的概念及区别** - **KVC (Key-Value Coding)**:允许动态访问和修改对象的属性,无需知道具体的getter和setter方法。 - **实现步骤**: 1. 根据方法名确定所需环境参数。 2. 结合`isa`指针和环境...

    Objectiov-c考试题

    12. **点语法与下划线语法**:题目14涉及到`self`与实例变量的差异,`self`的点语法会触发KVC或KVO,而直接使用下划线不会。 13. **delegate属性**:通常为`assign`以防止循环引用,因为代理对象通常拥有被代理对象...

    myProject_OC_firm3u4_DEMO_优化_

    3. **Key-Value Coding(KVC)与Key-Value Observing(KVO)**: KVC是一种间接访问对象属性的技术,无需调用getter或setter方法。KVO则允许我们监听对象属性的变化,从而实现数据驱动的编程。项目中的DEMO可能展示...

    30道iOS底层面试题

    2. **运行时机制**:iOS的动态特性源于Objective-C的运行时,包括消息传递、方法解析、KVC/KVO、Category、Protocol等。理解`objc_msgSend`函数的工作原理,以及如何利用 runtime 动态添加属性和方法。 3. **多线程...

    破解Objective-C面试:笑到最后的技术攻略!.zip

    技术关键词:Objective-C、iOS开发、Mac OS X、编程语言、面向对象编程、内存管理、自动引用计数(ARC)、协议(protocol)、类扩展(category)、键值观察(KVO)、键值编码(KVC)、Block、Delegate模式、多态性、...

    100家企业iOS面试题(下)

    #### 题目119:KVO与KVC的区别是什么? - **知识点**: - ** KVO**:键值观察(Key-Value Observing),用于跟踪对象属性的变化。 - ** KVC**:键值编码(Key-Value Coding),提供了一种间接访问对象属性的方式,...

    Objective-C基础教程(第2版)-有目录

    7. **KVC(Key-Value Coding)与KVO(Key-Value Observing)**:学习如何通过键值编码间接访问对象属性,以及通过键值观察监听属性变化。 8. **NSNotifications**:了解事件通知机制,如何发布、接收和移除通知。 ...

    ios-Runtime的实际使用场景.zip

    3. **KVC(Key-Value Coding)和KVO(Key-Value Observing)**: KVC允许间接访问对象属性,无需知道具体的setter和getter方法。KVO则可以监听属性的变化,Runtime自动处理观察者通知。这两者都依赖于Runtime。 4....

    IOS面试题2018总结188题

    KVC(Key Value Coding)与KVO(Key Value Observing) - **KVC**:允许对象通过键来获取和设置值,而不必了解对象内部的具体实现。 - **KVO**:用于观察对象属性的变化,并在属性变化时收到通知。 #### 3. 合成...

    Cocoa programming for mac os x 3rd 翻译版(仅16章)更新版

    - **NSBundle**:探讨NSBundle的作用和用途。 #### 十一、用户默认设置(UserDefaults) **知识点1:用户默认设置** - **NSDictionary与NSMutableDictionary**:用于存储键值对的容器。 - **NSUserDefaults**:...

    2018iOS一份高级面试题

    ### 面试题122:runtime 和 KVC 的联系与区别是什么? 1. **联系**:两者都是 Objective-C 运行时系统的特性,都涉及到动态操作。 2. **区别**:runtime 提供了更多的底层控制能力,而 KVC 更侧重于访问和设置对象...

    iOS面试题2019年度总结188题(下).pdf

    ### 第126题:`KVO`与`KVC`的区别 - **`KVO`**(Key-Value Observing):用于观察对象属性的变化。 - **`KVC`**(Key-Value Coding):提供了一种通过键值访问对象属性的方式,无需知道具体的属性名称和类型。 ###...

    Objective-C面试题.pdf

    3. **KVO与KVC**: - **KVO**:键值观察,允许对象监听其他对象的属性变化。 - **KVC**:键值编码,用于间接访问对象的属性。 4. **委托(Delegate)模式**: - **定义**:一种设计模式,允许对象之间进行通信。 ...

    Object-Oriented Programming with Objective-C

    这些指导原则包括但不限于:使用KVC(Key-Value Coding)和KVO(Key-Value Observing)来简化数据访问和观察,利用委托模式(Delegate Pattern)来实现组件间的通信,以及采用MVC(Model-View-Controller)架构来...

    iOS Runtime Demo

    4. KVO(Key-Value Observing)和KVC(Key-Value Coding):Runtime支持这些机制,使得对象的属性可以被观察和间接访问。 5. 动态方法解析:在无法解析消息时,Runtime会调用`+resolveInstanceMethod:`或`+...

Global site tag (gtag.js) - Google Analytics