什么是KVC& KVO值得麻烦吗?总是?

时间:2013-05-04 16:48:06

标签: objective-c model-view-controller syntax conventions kvc

它似乎是一个比Objective-C更新的超集,点符号的组合与指令混合,例如:studentsInClassA.@union.studentsInClassB.pets(...)和合规性语法,例如:-replaceObjectIn<Key>AtIndex:withObject:。似乎KVC的很大一部分类似于简单的存取方法,无论如何都可以合成。但是,我会说KVObserving似乎使MVC应用程序更容易。意见?

1 个答案:

答案 0 :(得分:4)

键值编码允许您查找任意嵌套的属性,这些属性的标识仅在运行时已知。例如,KVC不是person.name的良好替代品 - 对于这样一个特定任务来说它是不必要的通用。但是,假设我们在编写程序时不知道我们是否想要查找姓名,年龄或最喜欢的鞋品牌。我们经常使用NSTableView数据源遇到这种情况。我们可以编写一个重要的重复条件来发送我们想要的消息,但KVC可以轻松实现:

return [personController.selectedPerson valueForKeyPath:desiredAttribute];

然后我们可以将desiredAttribute设置为@"name"@"age"@"favoriteShoeBrand.name",即使我们只知道我们想要的属性,我们也会获得正确的值而不会分支运行时。

它也很有用,因为类可以以特殊方式处理KVC。例如,NSArray做了一件非常好的事情。 [arrayOfPeople valueForKeyPath:@"name"]不等同于arrayOfPeople.name - 而是将密钥路径传递给每个对象并创建一个新数组,其结果是这样做。因此它与许多其他语言中的map函数具有相同的用途。还有一些特殊的KVC运算符,例如@distinctUnionOfArrays(它采用数组的集合并将它们合并在一起,忽略重复),这使得对嵌套集合的操作比以往更加简洁。

至于KVO,它只是一种在发生变化时收到通知的方式 - 例如,您可以在一个人的生日时更新您的UI,而不需要UI了解生日逻辑。如果这对您有用,您可能会喜欢它。